django で JSON を受け取る

django で JSON を受け取る

先日こちらdjango で JsonResponse を使ってみるの記事で json の送信をやってみたので、今度は django で受け取る側をやってみたいと思います。

参考:【基本】DjangoでJSONを送受信する【テスト】

ルーティング

/django_project/config/urls.py


from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('jsonapp/', include('jsonapp.urls')),
]

/django_project/jsonapp/urls.py


from django.urls import path
from . import views

app_name = 'jsonapp'
urlpatterns = [
    path('receive_json/', views.receive_json, name='receive_json'),
]

JSONをポスト送信する

/django_project/jsonapp/request_json.py


import requests
import json

url = "http://127.0.0.1:81/jsonapp/receive_json/"
sess = requests.session()

print(sess.get(url))

csrftoken = sess.cookies['csrftoken']

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

# 送信データ
prm = {"param1": "パラメータ1", "param2": "パラメータ2"}

# JSON変換
params = json.dumps(prm)

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

# 戻り値を表示
print("--戻り値----------------------------")
print(json.loads(res.text))

JSONを受け取る

/django_project/jsonapp/views.py


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


@ensure_csrf_cookie
def receive_json(request):

    if request.method == 'GET':
        return JsonResponse({})

    # JSON文字列
    datas = json.loads(request.body)

    print("--受取り値--------------------------")
    print(type(datas))
    print(datas)

    # requestには、param1,param2の変数がpostされたものとする
    ret = {"data": "param1:" + datas["param1"] + ", param2:" + datas["param2"]}

    # JSONに変換して戻す
    return JsonResponse(ret)

実行結果

送信側の request_json.py を実行した結果は下の通りです。きちんとサーバーからレスポンスが返ってきているのが確認できました。


python3.6 request_json.py 

--戻り値----------------------------
{'data': 'param1:パラメータ1, param2:パラメータ2'}

受信側で runserver 中のターミナルの結果は下の通りです。きちんとポストされたJSONを受け取っているのが確認できました。


"GET /jsonapp/receive_json/ HTTP/1.1" 200 2
--受取り値--------------------------
<class 'dict'>
{'param1': 'パラメータ1', 'param2': 'パラメータ2'}