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 を入力し、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--')

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

・考察:以前の計算機能は、クエリ文字列で実現できるか?

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:テンプレートの検索ディレクトリ(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

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>

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。