動画リンク: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 を入力し、Enter を押す
- <
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'] # エラー
------------------------------------------------------------------
デモ 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
:テンプレートの検索ディレクトリ(1 つまたは複数可) 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.render(辞書データ) # 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>