視頻鏈接:https://www.bilibili.com/video/BV1vK4y1o7jH
一. GET 請求和 POST 請求#
定義#
・無論是 GET 還是 POST,統一都由
視圖函數
接收請求,通過判斷 request.method 區分具體的請求動作・範例:
if requests.method == 'GET': 處理GET請求時的業務邏輯 elif requests.method == 'POST': 處理POST請求的業務邏輯 else: 其他請求業務邏輯
------------------------------------------------------------------
演示 <項目同名文件夾下>/views.py def test_get_post(request): if request.method == 'GET': pass elif request.method == 'POST': #處理用戶提交數據 pass else: pass return HttpResponse('--test get post is ok--')
GET 處理#
・GET 請求動作,一般用於向伺服器
獲取數據
・能夠產生 GET 請求的場景:
- 瀏覽器地址欄中輸入 URL,回車後
- <
a href
="地址?參數 = 值 & 參數 = 值"> -
form表單
中的method為get
------------------------------------------------------------------
GET 請求方式中,如果有數據需要傳遞給伺服器,通常會用
查詢字符串(Query String)
傳遞【注意:不要傳遞敏感數據
】URL 格式:xxx
?參數名1=值1&參數名2=值2...
- 如:http://127.0.0.1:8000/page1`?a=100&b=200`
伺服器端接收參數
獲取客戶端請求 GET 請求提交的數據
・方法示例:
request.GET['參數名'] # QueryDict request.GET.get('參數名', '默認值') request.GET.getlist('參數名') # mypage?a=100&b=200&c=300&b=400 # request.GET=QueryDict({'a': ['100'], 'b': ['200', '400'], 'c': ['300']}) # a = request.GET['a'] # b = request.GET['b'] # Error
------------------------------------------------------------------
演示 http://127.0.0.1:8000/test_get_post?a=400 --test get post is ok-- 終端 <QueryDict: {'a': ['400', '200', '100']}> 100 ['400', '200', '100'] no c <項目同名文件夾下>/urls.py urlpatterns = [ ... path('test_get_post', views.test_get_post) ] <項目同名文件夾下>/views.py def test_get_post(request): if request.method == 'GET': print(request.GET) print(request.GET['a']) # 問卷調查 = form get 興趣愛好 - 複選框 print(request.GET.getlist('a')) print(request.GET.get('c', 'no c')) elif request.method == 'POST': #處理用戶提交數據 pass else: pass return HttpResponse('--test get post is ok--')
------------------------------------------------------------------
・思考:之前的計算器功能,能否拿查詢字符串做?
POST 處理#
・POST 請求動作,一般用於
向伺服器提交大量/隱私數據
・客戶端通過表單等 POST 請求將數據傳遞給伺服器端,如:
・伺服器端
接收參數
通過 request.method 來判斷是否為 POST 請求,如:
if request.method == 'POST': 處理POST請求的數據並響應 else: 處理非POST請求的響應
------------------------------------------------------------------
使用 post 方式接收客戶端數據
request.POST['參數名'] # request.POST 綁定QueryDict request.POST.get('參數名', '') request.POST.getlist('參數名')
取消csrf驗證,否則Django將會拒絕客戶端發來的POST請求,報403響應
------------------------------------------------------------------
取消 csrf 驗證
- 禁止掉 settings.py 中 MIDDLEWARE 中的 CsrfviewsMiddleWare 的中間件
MIDDLEWARE = [ ... # 'django.middleware.csrf.CsrfViewMiddleware', ... ]
------------------------------------------------------------------
演示
http://127.0.0.1:8000/test_get_post
post is ok 終端 uname is cpen <項目同名文件夾下>/urls.py urlpatterns = [ ... path('test_get_post', views.test_get_post) ] <項目同名文件夾下>/views.py POST_FORM = ''' <form method='post' action='/test_get_post'> 用戶名: <input type='text' name='uname'> <input type='submit' value='提交'> </form> ''' def test_get_post(request): if request.method == 'GET': return HttpResponse(POST_FORM) ...
---------------------------------------------------------------------------------------------------------------------------------
小節
・Django 處理 GET 請求
查詢字符串 - 少量數據傳遞
・Django 處理 POST 請求
專用於瀏覽器提交數據
二. Django 的設計模式及模板層#
MVC 和 MTV#
傳統的 MVC#
MVC 代表
Model-View-Controller
(模型 - 視圖 - 控制器)模式。
M模型層(Model)
,主要用於對數據庫層的封裝
V視圖層(View)
,用於向用戶展示結果(WHAT + HOW)
C控制(Controller)
,用於處理請求、獲取數據、返回結果(重要)作用:
降低模塊間的耦合度(解耦)
Django 的 MTV 模式#
MTV 代表
Model-Template-View
(模型 - 模板 - 視圖)模式。
M模型層(Model)
負責與數據庫交互
T模板層(Template)
負責呈現內容到瀏覽器(HOW)
V視圖層(View)
是核心,負責接收請求、獲取數據、返回結果(WHAT)作用:
降低模塊間的耦合度(解耦)
---------------------------------------------------------------------------------------------------------------------------------
模板層#
什麼是模板#
1、模板是可以根據
字典
數據動態變化的html網頁
2、模板可以
根據視圖中傳遞的字典數據動態生成相應的HTML網頁
模板配置#
創建模板文件夾
<項目名>/templates
在
settings.py
中TEMPLATES
配置項 1.BACKEND:指定模板的引擎
2.
DIRS
:模板的搜索目錄(可以是一個或多個) 3.APP_DIRS:是否要在應用中的 templates 文件夾中搜索模板文件
4.OPTIONS:有關模板的選項
・配置項中 需要修改部分
設置 DIRS -
'DIRS': [os.path.join(BASE_DIR, 'templates')],
------------------------------------------------------------------
演示
<項目同名文件夾下>/settings.py TEMPLATES = [ { ... 'DIRS': [os.path.join(BASE_DIR, 'templates')], ...
模板的加載方式#
方案 1 - 通過 loader 獲取模板,通過 HttpResponse 進行響應(特點:麻煩)
在視圖函數中:
from django.template import loader # 1.通過 loader 加載模板 t = loader.get_template("模板文件名") # 2.將 t 轉換成 HTML 字符串 html = t.reader(字典數據) # 3.用響應對象將轉換的字符串內容返回給瀏覽器 return HttpResponse(html)
--------------------------------------------------------------------------------------
演示
http://127.0.0.1:8000/test_html
<項目同名文件夾下>/urls.py urlpatterns = [ ... path('test_html', views.test_html) ] <項目同名文件夾下>/views.py def test_html(request): from django.template import loader t = loader.get_template('test_html.html') html = t.render() return HttpResponse(html) <項目文件夾下>/templates/test_html.html <h3>我是模板層的~~~~</h3>
---------------------------------------------------------------------------------------------------------------------------------
方案 2 - 通過 render () 直接加載並響應模板(特點:方便,大量使用這種)
在視圖函數中:
from django.shortcuts import render return render(request, '模板文件名', 字典數據)
--------------------------------------------------------------------------------------
演示
http://127.0.0.1:8000/test_html
<項目同名文件夾下>/views.py def test_html(request): # 方案2 from django.shortcuts import render return render(request, 'test_html.html')
視圖層與模板層之間的交互#
1、視圖函數中可以將 Python
變量
封裝到字典中傳遞到模板範例:
def xxx_view(request):
dic = {
"變量 1": "值 1",
"變量 2": "值 2",
}
return render(request, 'xxx.html',dic
)2、模板中,我們可以用 {{變量名}} 的語法 調用視圖傳進來的變量
--------------------------------------------------------------------------------------
演示
http://127.0.0.1:8000/test_html
<項目同名文件夾下>/urls.py urlpatterns = [ ... path('test_html', views.test_html) ] <項目同名文件夾下>/views.py def test_html(request): from django.shortcuts import render dic = {'username': 'peng', 'age': 23} return render(request, 'test_html.html', dic) <項目文件夾下>/templates/test_html.html <h3>{{ username }}是模板層的~~~~</h3>