目錄
- GET請求和POST請求
- 定義
- GET處理
- POST處理
- Django的設計模式及模板層
- MVC和MTV
- 傳統的MVC
- Django的MTV模式
- 模板層
- 什么是模板
- 模板配置
- 模板的加載方式
- 視圖層與模板層之間的互動
- MVC和MTV
博客鏈接 https://blog.csdn.net/cPen_web
視頻鏈接 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--')
- 思考
思考:之前的計算器功能,能否拿查詢字串做?
-- http://127.0.0.1:8000/整數/運算子/整數
-- http://127.0.0.1:8000/cal?x=10&y=20&op=add
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='https://www.cnblogs.com/cpenweb/archive/2022/02/16/提交'>
</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)
作用:降低模塊間的耦合度(解耦)

附:MTV-誕生記

模板層
什么是模板
- 模板是可以根據
字典資料動態變化的html網頁 - 模板可以
根據視圖中傳遞的字典資料動態生成相應的HTML網頁

模板配置
- 創建模板檔案夾
<專案名>/templates - 在
settings.py中TEMPLATES配置項
- BACKEND:指定模板的引擎
DIRS:模板的搜索目錄(可以是一個或多個)- APP_DIRS:是否要在應用中的templates檔案夾中搜索模板檔案
- 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')
視圖層與模板層之間的互動
- 視圖函式中可以將Python變數封裝到
字典中傳遞到模板
- 樣例:
def xxx_view(request):
dic = {
"變數1": "值1",
"變數2": "值2",
}
return render(request, 'xxx.html', dic)
- 模板中,我們可以用
{{ 變數名 }}的語法 呼叫視圖傳進來的變數
- 演示
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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/423927.html
標籤:其他
上一篇:Keycloak 團隊宣布他們正在棄用大多數 Keycloak 配接器,包括Spring Security和Spring Boot
下一篇:setLoginUser不是函式
