トッカンソフトウェア

Python Django JSON

前回はDjangoでGET、POST通信をやりましたが、今回は、JSONを使ってみます。
前回の続きからやるので環境構築は前回までを参照下さい。

POST送信でRequestsを使用していますが、それはこちらを参照下さい。


CSRFなし

CSRF対策を行おうとして処理の記述を間違えると、 403エラーが出たり、500エラーが出たりします。
とりあえずテスト用の動作確認でセキュリティに考慮しないのであれば@csrf_exemptを使ってCSRF対策なしで動作させることができます。

サーバ側処理

views.py
				
from django.views.decorators.csrf import csrf_exempt
from django.http.response import JsonResponse
import json


@csrf_exempt
def index(request):

    # JSON文字列をデータ(辞書)に戻す
    datas = json.loads(request.body)

    # 戻り値の編集
    ret = {"data": "戻り値:" + datas["str1"] + "-" + datas["str2"]}

    # データ(辞書)をJSONに変換して呼び出し元に戻す
    return JsonResponse(ret)


			

クライアント側処理

hello/views.py
				
import requests
import json


url = "http://127.0.0.1:8000/hello/"
sess = requests.session()

# 送信するデータ(辞書)をセット
prm = {"str1": "あああ", "str2": "いいい"}

# データ(辞書)をJSONに変換
params = json.dumps(prm)

# JSONをPOST送信
res = sess.post(url, data=params)

# 戻り値JSONをデータ(辞書)に変換して表示
print(json.loads(res.text))


			
実行結果
				
(test) C:\work\py>python test.py
{'data': '戻り値:あああ-いいい'}

			

CSRFあり

CSRF対策を行う場合、まずはGETでクッキーよりcsrf_tokenを取得し、POSTで取得したcsrf_tokenを送信します。
csrf_tokenを取得するため、@ensure_csrf_cookieを使用します。
(WEBフォームであれば{% csrf_token %}で取得できます)

サーバ側処理

				
import json
from django.http.response import JsonResponse
from django.views.decorators.csrf import ensure_csrf_cookie


@ensure_csrf_cookie
def index(request):

    # 最初のGETでアクセスしてCSRF情報を返す
    if request.method == 'GET':
        return JsonResponse({})

    # JSON文字列をデータ(辞書)に戻す
    datas = json.loads(request.body)

    # 戻り値の編集
    ret = {"data": "戻り値:" + datas["str1"] + "-" + datas["str2"]}

    # データ(辞書)をJSONに変換して呼び出し元に戻す
    return JsonResponse(ret)


			

クライアント側処理

				
import requests
import json


url = "http://127.0.0.1:8000/hello/"
sess = requests.session()

# CSRF情報を取得する
print(sess.get(url))

# CSRF情報をクッキーより取り出す
csrftoken = sess.cookies['csrftoken']

# ヘッダの作成
headers = {'Content-type': 'application/json',  "X-CSRFToken": csrftoken}

# 送信するデータ(辞書)をセット
prm = {"str1": "あああ", "str2": "いいい"}

# データ(辞書)をJSONに変換
params = json.dumps(prm)

# JSONをPOST送信
res = sess.post(url, data=params, headers=headers)

# 戻り値JSONをデータ(辞書)に変換して表示
print(json.loads(res.text))


			
実行結果
				
(test) C:\work\py>python test.py
<Response [200]>
{'data': '戻り値:あああ-いいい'}

			

ページのトップへ戻る