[TOC]
>[success] # 負責啟動服務器 server.py
~~~
1. 創建一個Request,用來封裝每個用戶請求的 method、path、query、body
headers、cookies 信息,其中form 保存post 請求從body獲取的參數
2.Reuest 方法中 add_header 把獲取的請求頭數據進行處理封裝到字典
3.add_cookies 獲取封裝header 中的cookies
4.run socket 啟動服務裝置
5.process_request 獲取輸入請求
6.parsed_path 處理get 請求的參數
7.response_for_path 路由映射
~~~
~~~
import socket
import urllib.parse
import _thread
from routes.routes_static import route_static
from routes.routes_static import route_dict
from utils import log
class Request:
def __init__(self):
self.method = "GET"
self.path = ''
self.query = {}
self.body =''
self.headers = {}
self.cookies ={}
def add_cookies(self):
"""
從頭部獲取到cookies 信息
:return:
"""
cookies = self.headers.get('Cookie', '')
kvs = cookies.split('; ')
log('cookie', kvs)
for kv in kvs:
if '=' in kv:
k, v = kv.split("=")
self.cookies[k] = v
def add_header(self, header):
lines = header
for line in lines:
k, v = line.split(': ', 1)
self.headers[k] = v
self.add_cookies()
def form(self):
f = {}
args = self.body.split("&")
log('form debug', args, len(args))
for arg in args:
k, v = arg.split('=')
f[k] = urllib.parse.unquote(v)
return f
def error(request, code=404):
"""
根據 code 返回不同的錯誤響應
目前只有 404
"""
e = {
404: b'HTTP/1.1 404 NOT FOUND\r\n\r\n<h1>NOT FOUND</h1>',
}
return e.get(code, b'')
# socket 啟動開始
def run(host='', port=3000):
"""
啟動服務器
"""
# 初始化 socket 使用with 可以保證正確關閉socket 釋放的占用的端口
log('start at', '{}:{}'.format(host, port))
with socket.socket() as s:
s.bind((host, port))
s.listen(5)
while True:
connection, address = s.accept()
print('連接成功, 使用多線程處理請求', address)
# 開一個新的線程來處理請求, 第二個參數是傳給新函數的參數列表, 必須是 tuple
# tuple 如果只有一個值 必須帶逗號,就是函數的參數
_thread.start_new_thread(process_request, (connection,))
def process_request(connection):
r = connection.recv(1100)
log('請求request', r)
r = r.decode('utf-8')
if len(r.split()) < 2:
connection.close()
log('r', r.split())
path = r.split()[1]
# 進來一個連接創建一個 request 請求對象
request = Request()
request.method = r.split()[0]
request.add_header(r.split('\r\n\r\n', 1)[0].split('\r\n')[1:])
request.body = r.split('\r\n\r\n', 1)[1]
# 用 response_for_path 函數來得到 path 對應的響應內容
response = response_for_path(path, request)
# 把響應發送給客戶端
connection.sendall(response)
try:
log(response.decode('utf-8').replace('\r\n', '\n'))
except Exception as e:
log('異常', e)
# 處理完請求, 關閉連接
connection.close()
# 用來判斷 連接是get 還是 post 然后 通過鏈接獲取參數
def parsed_path(path):
index = path.find('?')
if index == -1:
return path,{}
else:
path, query_string = path.split('?', 1)
args = query_string.split('&')
query = {}
for arg in args:
k, v = arg.split('=')
query[k] = v
return path, query
def response_for_path(path, request):
path, query = parsed_path(path)
request.path = path
request.query = query
r = {
'/static': route_static,
}
# 注冊外部的路由
r.update(route_dict)
response = r.get(path, error)
return response(request)
if __name__ == '__main__':
# 生成配置并且運行程序
config = dict(
host='',
port=8000,
)
run(**config)
~~~
- 網絡原理
- 為搭建框架做準備
- 簡單認識網路
- 自定義模擬網站案例
- 優化最終框架
- 數據存儲 -- data
- 用戶個人信息存儲 -- User.txt
- 路由映射 -- routes
- 處理用戶信息 -- routes_static.py
- 保存靜態文件 -- static
- templates -- html 集中處理模塊
- 首頁 -- index.html
- 登陸 -- login.html
- 用戶注冊頁面 -- register
- 日志模塊 -- log.gua.txt
- 啟動文件--server.py
- orm處理 -- model.py
- 日志模塊 -- utils.py
- 兩種數據庫類型
- 傳統數據庫了解篇
- 前端快速入門
- JS簡單使用入門
- css簡單快速入門
- DJANGO
- virtualenv-創建虛擬環境
- 項目結構
- django-admin中文配置
- django-打印sql語句
- django-基礎
- 認識MVC和MTV
- Django--初識
- Django--初識案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-數據庫配置
- ORM-model字段
- ORM-model字段解釋
- ORM-字段選項
- ORM-查詢
- ORM-四種常用查詢方法
- ORM-三種獲取數據
- ORM-其他查詢方式
- ORM-條件查詢雙線
- ORM-Q和F條件使用
- ORM-三種數據庫交互
- 案例 -- 一對多
- ORM-技巧/常見問題
- ORM-N+1 問題
- ORM-并發的處理
- ORM-數量查詢、
- ORM-正向反向查詢
- ORM-基礎案例一
- ORM-基礎一對多案例
- Django-templates
- Django-模板的繼承
- Django-模板的過濾
- Django-自定義模板的過濾
- Django-cookie
- Django-cookies 裝飾器
- Djang-session
- Django-CSRF
- Django-中間件 -- 后續了解
- Django- 緩存 -- 沒有深入了解
- Django-form
- From-ajax
- form-內部驗證處理
- form-屬性
- form-常用的標簽字段
- form-常用的下拉和選擇
- form-widget速查
- Django-ajax序列化
- Django-多種ajax寫法
- ajax-原生寫法
- ajax-$寫法
- ajax-ifram
- Django-ajax圖片上傳
- ajax-原始寫法
- ajax-正常寫法
- iframe+form
- 實戰寫法
- Django-常用自編寫組件
- Django-雙菜單組合搜索
- Django - 多菜單組合搜索
- Django-分頁
- django-綜合基礎
- 綜合基礎-render
- django-admin
- admin-頁面配置
- admin-字段配置
- admin-編輯頁面
- admin-forms驗證
- admin-創建抽象類
- django-驗證碼
- 驗證碼-第三方生成庫
- 驗證碼-view.py使用
- 驗證碼-注意引入Monaco.ttf
- django-用戶注冊
- 注冊-form 模塊
- 注冊-views 模塊
- 注冊-html模塊
- 注冊-model模塊
- django-用戶登錄三種
- session登錄
- form-session 寫法
- view-寫法
- Html-寫法
- model-寫法
- 繼承類登錄
- 外鍵關聯登錄
- django-簡單的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和數據庫關聯的寫法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系統
- APP目錄-models.py 創建
- APP目錄-基礎展示數據分析
- APP目錄-基礎數據展示cls
- ListView
- DetailView
- FormView
- 額外功能拓建
- 添加文章搜索/用戶文章查詢功能
- 增加一個友情鏈接
- 增加一個評論模塊
- App-利用Bootstrap4 搭建樣式
- 項目crm
- 思維導圖
- perfectCRM-項目名字
- settings.py-配置
- view.py-登陸/登出函數
- crm-app文件
- model.py-表的創建
- admin.py-注冊后臺
- view.py-視圖層
- static-靜態文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首頁模板