django框架
django框架前導(dǎo)
自己手寫(xiě)的原始版web框架(1.0)
問(wèn)
1.我們?cè)谧约壕帉?xiě)web框架之前需要先弄清楚web框架的作用
2.我們編寫(xiě)web框架時(shí)要弄清楚需要實(shí)現(xiàn)什么樣的功能
答
1.web框架的作用就是連接前端與數(shù)據(jù)庫(kù),web框架可以被看成是連接兩者的中間介質(zhì),也可以簡(jiǎn)單的理解為socket服務(wù)端
2.我們編寫(xiě)的web框架最基礎(chǔ)的功能就是實(shí)現(xiàn)瀏覽器訪(fǎng)問(wèn),且可以根據(jù)不同的網(wǎng)址后綴獲取不同的頁(yè)面內(nèi)容
手寫(xiě)web框架思路
1.先編寫(xiě)一個(gè)socket服務(wù)端
2.瀏覽器此時(shí)直接訪(fǎng)問(wèn)是無(wú)效的,因?yàn)閔ttp協(xié)議的存在,所以我們需要在服務(wù)端中添加http協(xié)議
3.瀏覽器直接訪(fǎng)問(wèn)成功,再進(jìn)一步,根據(jù)網(wǎng)址后綴的不同獲取不同的頁(yè)面
4.在服務(wù)端想辦法獲取用戶(hù)輸入的網(wǎng)址后綴(一般是在請(qǐng)求首行中)
GET /index HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
sec-ch-ua: "Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
5.對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行處理獲得網(wǎng)址后綴
純手寫(xiě)的web框架可以實(shí)現(xiàn)最基本的功能,但是有幾個(gè)問(wèn)題
1.socket代碼過(guò)于重復(fù)
2.請(qǐng)求數(shù)據(jù)的處理過(guò)于繁瑣
3.后綴匹配邏輯也比較繁瑣
手?jǐn)]框架進(jìn)階(基于wsgiref模塊)(2.0)
wsgiref模塊是一個(gè)內(nèi)置模塊,它是很多web框架底層使用的模塊
它的作用就是
1.封裝了socket代碼
2.處理了請(qǐng)求數(shù)據(jù)
那么針對(duì)1,0版本的手寫(xiě)web框架出現(xiàn)的問(wèn)題我們就可以很好的解決前兩個(gè)問(wèn)題
1.啟動(dòng)服務(wù)端有固定的代碼
2.相關(guān)的請(qǐng)求數(shù)據(jù)會(huì)被自動(dòng)處理成一個(gè)大字典request
3.我們可以根據(jù)大字典的鍵值對(duì)來(lái)獲取不同的網(wǎng)址后綴名,從而返回不同的頁(yè)面內(nèi)容
現(xiàn)在還剩下最后一個(gè)問(wèn)題:后綴匹配邏輯如何處理
代碼封裝優(yōu)化
可以根據(jù)我們之前寫(xiě)購(gòu)物車(chē)和選課系統(tǒng)的模式將后綴匹配成功后執(zhí)行的代碼封裝成不同的函數(shù),網(wǎng)址后綴名與函數(shù)做一個(gè)對(duì)應(yīng)關(guān)系
1.網(wǎng)址后綴名與功能函數(shù)做對(duì)應(yīng)
2.功能函數(shù)中存放具體的業(yè)務(wù)代碼
3.功能函數(shù)和對(duì)應(yīng)關(guān)系放在不同的py文件中
views.py 存放核心業(yè)務(wù)邏輯(功能函數(shù))
urls.py 存放網(wǎng)址后綴與函數(shù)名的對(duì)應(yīng)關(guān)系
templates 存放html頁(yè)面文件
4.可以將request大字典順手傳給功能函數(shù),讓業(yè)務(wù)邏輯有更多的數(shù)據(jù)可用
動(dòng)靜態(tài)網(wǎng)頁(yè)
動(dòng)態(tài)網(wǎng)頁(yè)就是頁(yè)面數(shù)據(jù)來(lái)源于后端,后端給什么它就顯示什么
靜態(tài)網(wǎng)頁(yè)則是頁(yè)面數(shù)據(jù)直接寫(xiě)死要想改變只能在源文件中修改
jinja2模塊
可以在html頁(yè)面上通過(guò)類(lèi)似于后端的操作方式來(lái)操作數(shù)據(jù)
pip3 install jinja2
from jinja2 import Template
def get_dict_func(request):
user_dict = {'name': 'jason', 'age': 18, 'person_list': ['阿珍', '阿強(qiáng)', '阿香', '阿紅']}
with open(r'templates/get_dict_page.html', 'r', encoding='utf8') as f:
data = f.read()
temp_obj = Template(data) # 將頁(yè)面數(shù)據(jù)交給模板處理
res = temp_obj.render({'d1': user_dict}) # 給頁(yè)面?zhèn)髁艘粋€(gè) 變量名是d1值是字典數(shù)據(jù)的數(shù)據(jù)
return res
<p>{{ d1 }}</p>
<p>{{ d1.name }}</p>
<p>{{ d1['age'] }}</p>
<p>{{ d1.get('person_list') }}</p>
python主流web框架
1.django
自身攜帶的功能組件非常多
2.flask
自身攜帶的功能組件很少,但是它可以使用第三方模塊
3.tornado
異步非阻塞,速度極快效率極高
django基本使用
1.下載
cmd下載
pip38 install django 下載源 默認(rèn)下載最新版
pip38 install django==2.2.22 下載源 指定下載版本
pycharm中下載
File==>Settings==>Project: ==>Python Interpreter 雙擊右邊空白處搜索框中直接搜索即可,在這里可看見(jiàn)版本號(hào)
2.驗(yàn)證
django-admin 有反應(yīng)說(shuō)明下載成功,或者去pycharm中查看
3.創(chuàng)建django項(xiàng)目
django-admin startproject 項(xiàng)目名
4.啟動(dòng)django項(xiàng)目
cd 項(xiàng)目名 # 進(jìn)入項(xiàng)目目錄
python38 manage.py runserver 127.0.0.1:8080
注意:
這里啟動(dòng)django是可能會(huì)報(bào)錯(cuò):[WinError 10013] 以一種訪(fǎng)問(wèn)權(quán)限不允許的方式做了一個(gè)訪(fǎng)問(wèn)套接字的嘗試。
這是由于端口沖突導(dǎo)致的,換一個(gè)端口號(hào)就好了
5.pycharm創(chuàng)建django項(xiàng)目時(shí)會(huì)自動(dòng)創(chuàng)建templates文件夾,但是配置文件中需要修改文件路徑
cmd創(chuàng)建的django項(xiàng)目沒(méi)有templates文件夾,需要自己手動(dòng)創(chuàng)建,而且吧配置文件需要自己配置一個(gè)路徑
django app的概念
app即application,django是一個(gè)大的整體,app則是下面的具體的功能模塊
app創(chuàng)建
命令行創(chuàng)建
python38 manage.py startapp 應(yīng)用名
pycharm創(chuàng)建
新建django項(xiàng)目時(shí)可以默認(rèn)創(chuàng)建一個(gè),且自動(dòng)注冊(cè),自己手動(dòng)創(chuàng)建則是在Terminal中編寫(xiě)cmd命令創(chuàng)建
無(wú)論是cmd命令行創(chuàng)建的還是pycharm中命令創(chuàng)建的都需要去settings.py中注冊(cè)
INSTALLED_APPS = [
'app01.apps.App01Config', # 完整寫(xiě)法
'app02' # 簡(jiǎn)寫(xiě)
]
django主要目錄結(jié)構(gòu)
django項(xiàng)目目錄名
manage.py 入口文件
templates目錄 模板層(存儲(chǔ)html文件)
db.sqlite3文件 django自帶的小型數(shù)據(jù)庫(kù)(項(xiàng)目啟動(dòng)之后才會(huì)出現(xiàn))
django項(xiàng)目同名目錄
settings.py 配置文件
urls.py 路由層(存儲(chǔ)網(wǎng)址后綴與函數(shù)名對(duì)應(yīng)關(guān)系)
wsgi.py wsgiref網(wǎng)關(guān)文件
應(yīng)用目錄
migrations 存儲(chǔ)數(shù)據(jù)庫(kù)相關(guān)記錄
admin.py django內(nèi)置的admin后臺(tái)管理功能
apps.py 注冊(cè)app相關(guān)
models.py 模型層(與數(shù)據(jù)庫(kù)打交道的)
tests.py 測(cè)試文件
views.py 視圖層(存儲(chǔ)功能函數(shù))
'''
網(wǎng)址后綴 ==> 路由
函數(shù) ==> 視圖函數(shù)
類(lèi) ==> 視圖類(lèi)
'''
小白三板斧
from django.shortcuts import render,HttpResponse,redirect
HttpResponse 可以返回字符串類(lèi)型得數(shù)據(jù)
render 返回html頁(yè)面并且支持傳值
redirect 重定向