Django框架
web框架本質
web框架的本質就是socket伺服器端,用來連線前端(socket使用者端)與資料庫的中間媒介
手寫web框架
1.編寫socket伺服器端程式碼
2.瀏覽器對伺服器端進行存取,存取響應無效>>>:HTTP協定
3.根據網址字尾的不同獲取不同的頁面內容
4.想辦法獲取使用者輸入的字尾>>>:請求資料
5.請求首行>>>:GET/‘使用者輸入的字尾’ HTTP/1.1
import socket
server = socket.socket() # TCP UDP
server.bind(('127.0.0.1', 8080)) # IP PORT
server.listen(5) # 半連線池
while True:
sock, address = server.accept() # 等待連線
data = sock.recv(1024) # 位元組(bytes)
# print(data.decode('utf8')) # 解碼列印
sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
data_str = data.decode('utf8') # 先轉換成字串
target_url = data_str.split(' ')[1] # 按照空格切割字串並取索引1對應的資料
# print(target_url) # /index /login /reg
if target_url == '/index':
# sock.send(b'index page')
with open(r'myhtml01.html','rb') as f:
sock.send(f.read())
elif target_url == '/login':
sock.send(b'login page')
else:
sock.send(b'home page!')
以上程式碼雖然實現了web框架的基本雛形與功能,但是有以下幾點缺點
wsgire模組簡介
該模組是python自帶的內建模組,也是很多web框架底層使用的模組
該模組實現了以下功能:
1.固定程式碼啟動伺服器端
2.檢視處理之後的request字典
3.根據不同網址字尾返回不同的內容>>>:研究字典鍵值對
4.解決以上純手擼的兩個問題
5.針對最後一個問題程式碼如何優化
from wsgiref.simple_server import make_server
def run(request, response):
"""
:param request: 請求相關資料
:param response: 響應相關資料
:return: 返回給使用者端的真實資料
"""
response('200 OK', []) # 固定格式 不用管它
# print(request) 是一個處理之後的大字典
path_info = request.get('PATH_INFO')
if path_info == '/index':
return [b'index']
elif path_info == '/login':
return [b'login']
return [b'hello wsgiref module']
if __name__ == '__main__':
server = make_server('127.0.0.1', 8080, run) # 實時監聽127.0.0.1:8080 一旦有請求過來自動給第三個引數加括號並傳引數呼叫
server.serve_forever() # 啟動伺服器端
1.網址字尾的匹配問題
2.每個字尾匹配成功後執行的程式碼有多有少
麵條版 函數版 模組版
3.將分支的程式碼封裝成一個個函數
4.將網址字尾與函數名做對應關係
5.獲取網址字尾迴圈匹配
6.如果想新增功能只需要先寫函數再新增一個對應關係即可
7.根據不同的功能拆分成不同的py檔案
views.py 儲存核心業務邏輯(功能函數)
urls.py 儲存網址字尾與函數名對應關係
templates目錄 儲存html頁面檔案
8.為了使函數體程式碼中業務邏輯有更多的資料可用
將request大字典轉手傳給這個函數(可用不用但是不能沒有)
動態網頁:頁面資料來源於後端
靜態網頁:頁面資料直接寫死
要求
1.存取某個網址字尾 後端程式碼獲取當前時間 並將該時間傳到html檔案上再返回給瀏覽器展示給使用者看
讀取html內容(字串型別) 然後利用字串替換 最後再返回給瀏覽器
2.將字典傳遞給頁面內容 並且在頁面上還可以通過類似於後端的操作方式操作該資料
模板語法>>>:jinja2模組
pip3 install jinja2
from jinja2 import Template
def get_dict_func(request):
user_dict = {'name': 'jason', 'age': 18, 'person_list': ['阿珍', '阿強', '阿香', '阿紅']}
with open(r'templates/get_dict_page.html', 'r', encoding='utf8') as f:
data = f.read()
temp_obj = Template(data) # 將頁面資料交給模板處理
res = temp_obj.render({'d1': user_dict}) # 給頁面傳了一個 變數名是d1值是字典資料的資料
return res
<p>{{ d1 }}</p>
<p>{{ d1.name }}</p>
<p>{{ d1['age'] }}</p>
<p>{{ d1.get('person_list') }}</p>
1.前端瀏覽器存取get_user 後端連線資料庫查詢use表中所有的資料 傳遞到某個html頁面 弄弄好樣式 再傳送給瀏覽器展示
{% for user_dict in user_data_list %}
<tr>
<td>{{ user_dict.id }}</td>
<td>{{ user_dict.name }}</td>
<td>{{ user_dict.age }}</td>
</tr>
{% endfor %}
Django
大而全,自身自帶的功能元件非常的多,類似於航空母艦,缺點是過於笨重
Flask
小而精,自身自帶的功能元件非常少,類似於遊騎兵,缺點是幾乎所有的功能都需要依賴於第三方模組
Tornado
非同步非阻塞,速度快效率極高,可以充當遊戲伺服器
Django是一個開放原始碼的Web應用框架,由Python寫成。採用了MTV的框架模式,即模型M,檢視V和模版T。是web開發者的首選框架
版本問題
django1.X:同步 1.11
django2.X:同步 2.2
django3.X:支援非同步 3.2
django4.X:支援非同步 4.2
ps:版本之間的差異其實不大 主要是新增了額外的功能
執行注意事項
2.執行django注意事項
1.django專案中所有的檔名目錄名不要出現中文
2.計算機名稱儘量也不要出現中文
3.一個pycharm儘量就是一個完整的專案(不要巢狀 不要疊加)
4.不同版本的python直譯器與不同版本的django可能會出現小問題
下載django
1、cmd命令符視窗使用pip工具下載
pip3 install django 預設最新版
pip3 install django==版本號 指定版本
pip3 install django==2.2.22
'''
pip下載模組會自動解決依賴問題(會把關聯需要用到的模組一起下了)
'''
驗證django下載情況
1、開啟cmd命令視窗
2、輸入diango-admin
3、如果下載成功會彈出django相關資訊及命令資訊
常見命令
1、建立django專案
diango-admin startproject 專案名
2、啟動django專案
cd 專案名
python38 manage.py runserver ip:port
pycharm建立django專案
1、直接開啟pycharm軟體進行建立
2、pycharm會自動建立templates資料夾,但是組態檔中會報錯
需要對seetings檔案中的DATABASES字典進行手動修改
將NAME目錄重新進行設定
[os.path.join(BASE_DIR, 'db.sqlite3'),],
概念
app的建立方法
建立注意事項
建立的app一定要去settings.py中註冊
INSTALLED_APPS = [
'app01.apps.App01Config',
'app02'
]
django專案目錄名
django專案同名目錄
settings.py 組態檔
urls.py 儲存網址字尾與函數名對應關係(不嚴謹)
wsgi.py wsgiref閘道器檔案
db.sqlite3檔案 django自帶的小型資料庫(專案啟動之後才會出現)
manage.py 入口檔案(命令提供)
應用目錄
migrations目錄 儲存資料庫相關記錄
admin.py django內建的admin後臺管理功能
apps.py 註冊app相關
models.py 與資料庫打交道的(非常重要)
tests.py 測試檔案
views.py 儲存功能函數(不嚴謹)
templates目錄 儲存html檔案(命令列不會自動建立 pycharm會)
組態檔中還需要設定路徑
[os.path.join(BASE_DIR,'templates'),]
"""
網址字尾 路由
函數 檢視函數
類 檢視類
重要名詞講解
urls.py 路由層
views.py 檢視層
models.py 模型層
templates 模板層
"""
再模板層中建立模板時,需匯入三種不同的模組,三種模組對應不同的方法和應用場景,這三個模組對應的方法是初學者必須要掌握的方法,所以名為「三板斧」
from django.shortcuts import render,HttpResponse,redirect
HttpResponse 返回字串型別的資料
render 返回html頁面並且支援傳值
redirect 重定向