mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

03_Django-GET請求和POST請求-設計模式及模板層

視頻鏈接: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 請求將數據傳遞給伺服器端,如:

image-20220505232318528

・伺服器端接收參數

​ 通過 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

image-20220505233651466

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),用於處理請求、獲取數據、返回結果(重要)

作用:降低模塊間的耦合度(解耦)

image-20220505233857207

Django 的 MTV 模式#

MTV 代表Model-Template-View(模型 - 模板 - 視圖)模式。

  • M模型層(Model)負責與數據庫交互

  • T模板層(Template)負責呈現內容到瀏覽器(HOW)

  • V視圖層(View)是核心,負責接收請求、獲取數據、返回結果(WHAT)

作用:降低模塊間的耦合度(解耦)

image-20220505234057843

---------------------------------------------------------------------------------------------------------------------------------

img

模板層#

什麼是模板#

1、模板是可以根據字典數據動態變化的html網頁

2、模板可以根據視圖中傳遞的字典數據動態生成相應的HTML網頁

image-20220505234226094

模板配置#

創建模板文件夾 <項目名>/templates

settings.pyTEMPLATES配置項

​ 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

image-20220505234508244

 <項目同名文件夾下>/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

image-20220505234639279

 <項目同名文件夾下>/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

image-20220505234825246

 <項目同名文件夾下>/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>

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。