ホーム >  Python > Django >  【基本】DjangoでJSONを送受信する【テスト】

投稿日:   |  最終更新日:

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

DjangoPython

昨今、WebアプリケーションでJSON形式のデータをやり取りすることが当たり前になってきました。Djangoで基本的な部分を抑えたいと思います。

JSON送受信

DjangoでJSON形式をやり取りするのであれば、「Django REST Framework」でAPIを作るほうが簡単です。しかし、まずは基本的なところを押さえてやり方を確認しておきましょう。

また、Pythonでは以下のようにしてJSONファイルを操作します。

実は簡単!JSON形式データを扱う方法

仕様

起動中のDjangoサーバーに対してコマンド(pythonプログラム実行)でJSONデータを送信します。すると、DjangoからJSONデータが返ってきます。

コマンドプロンプトやLinuxの場合は端末を2つ開きます。

1つはDjangoを起動します。

もう1つはDjangoに対してJsonリクエストするpythonスクリプトを実行します。

準備

当サイトでは、Vagrantでゲスト環境(仮想環境)を作ってDjangoを動かいていますが、それ以外の環境でも操作方法はだいたい同じです。

①Djangoプロジェクトを生成します。

VagrantのDjangoで作るWebアプリケーション(その1 プロジェクト生成)

②Djangoアプリケーションを作ります。

VagrantのDjangoで作るWebアプリケーション(その2 プロジェクトの初期設定)

環境

OS CentOS 7.1.1503
pyenv 1.1.3-5-g7dae197
mod_wsgi 4.5.14
Django 2.0.3


JSON送受信アプリ概要

①以下のようなDjangoアプリ構成を作ります。プロジェクト名が「pj1」で、アプリケーション名が「users」です。プロジェクトの設定は済ませたものとします。赤字のファイルは、今回変更する部分です。

  • pj1/
  • pj1/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • users/
  • __init__.py
  • admin.py
  • apps.py
  • urls.py
  • views.py
  • models.py
  • templates/

パッケージ準備

①requestsパッケージを利用しますのでインストールします。

pip install requests

requests

PythonのHTTPライブラリです。Pythonにはurllib2というライブラリがありますが、公式サイトには「Requestsは、人間向けのPythonで書かれたApache2ライセンスのHTTPライブラリです。」とあります。

urlの設定

まず、usrs(アプリケーション)ディレクトリのurls.pyを記述した後、pj1(プロジェクトディレクトリ)のurls.pyも記述します。

  • pj1/
  • pj1/
  • urls.py
  • 〜省略〜
  • users/
  • urls.py
  • 〜省略〜
  • templates/

①usersディレクトリのurls.pyに以下の内容を記述します。(url名は任意です。)

from django.conf.urls import url

from . import views

app_name = 'users'

urlpatterns = [
    # JSON
    url("^jsonreceiver/$",views.jsonreceiver,name='jsonreceiver'),
]

②pj1ディレクトリのurls.pyに以下の内容を記述します。

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('users.urls', namespace = 'users')),  # urlと他のurlpatternsとの結びつけ
]

viewの追加

①usersディレクトリのviews.pyに以下の内容を記述します。

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

@ensure_csrf_cookie
def jsonreceiver(request):

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

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

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

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

解説

from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie

クロスサイトリクエストフォージェリ (cross-site request forgeries)対策をクッキーにセットします。

通常Djangoは、「{% csrf_token %}」をテンプレートに記述しないとcsrftokenをクッキーにセットしません。

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

Getメソッドだった場合、空のJsonを返します。JsonResponse()は、JSONのレスポンスを返す関数です。

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

request.bodyを辞書型に変換します。json.loadsは文字列を辞書型にデコード(変換)するための関数です。


postを実行するスクリプト

参考サイトに倣って、jsontest.pyからPOSTして確認します。ファイルの設置場所はpythonが実行できればどこでも結構です。

Python Django JSON | トッカンソフトウェア

from django.test import TestCase

import requests
import json


url = "http://192.168.xx.yy:8000/jsonreceiver/"
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(json.loads(res.text))

解説

url = "http://192.168.xx.yy:8000/jsonreceiver/"

post先のurlです。先ほどDjangoのurls.pyに設定したjsonリクエストを受信するview(jsonreceiver)のurlを記述します。

sess = requests.session()

リクエストをセッションモードにします。

ログインを必要とするWebサイトの情報を取得する場合、Requestsを用います。しかし、その都度GETやPOSTでアクセスするとセッションが途切れてしまい毎回ログイン処理をしないといけません。これを回避するため、RequestsはSessionモードをサポートしています。

※具体的にはcookieを保持しつつurllib3のconnectionpoolモジュールを使用し、基盤となるTCP接続を再利用していくようです。

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

prmをエンコードします。dumps関数はエンコード(辞書型を文字列に変換)するための関数です。

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

postメソッドでurlに対してリクエストします。リクエストの戻り値をresに格納します。

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

先ほど利用しましたが、json.loadsは文字列を辞書型に変換するものです。


Django実行・jsontest.pyの実行

①1つの窓のコマンドプロンプトor端末を開き、以下のコマンドでDjangoを起動します。

python manage.py runserver

②もう1つの別窓でコマンドプロンプト・端末を開きます。以下のコマンドでjsontest.pyを実行します。

python jsontest.py 

以下のような結果が表示されます。

<Response [200]>
{'data': 'param1:パラメータ1, param2:パラメータ2'}


トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告