投稿日: | 最終更新日:
【基本】DjangoでJSONを送受信する【テスト】
昨今、WebアプリケーションでJSON形式のデータをやり取りすることが当たり前になってきました。Djangoで基本的な部分を抑えたいと思います。
JSON送受信
DjangoでJSON形式をやり取りするのであれば、「Django REST Framework」でAPIを作るほうが簡単です。しかし、まずは基本的なところを押さえてやり方を確認しておきましょう。
また、Pythonでは以下のようにして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'}
- Python 114
- 制作 54
- RaspberryPi 41
- Django 40
- WordPress 40
- Linux 27
- VPS 22
- JavaScript 21
- PHP 20
- HTML・CSS 19
- AWS 16
- 仮想環境 15
- レスポンシブデザイン 13
- マイコン 11
- WEB全般 11
- 動画製作 9
- Webサービス 8
- 統合開発環境 8
- 機械学習 8
- PyCharm 7
- jQuery 7
- AfterEffects 7
- 起業・設立 7
- Django REST framework 6
- C# 6
- デザイン 6
- SEO 6
- pydata 6
- Visual Studio 5
- 数学 5
- 携帯サイト 5
- heroku 5
- Mac 5
- illustrator 5
- node.js 5
- Anaconda 5
- Nginx 4
- Jupyter Notebook 4
- インフラ 4
- Google Colaboratory 4
- symfony 4
- Webスクレイピング 3
- photoshop 3
- Go言語 3
- PC 3
- ツール 3
- Docker 3
- facebook 3
- 作業効率化 3
- データベース 3
- Cloud9 3
- コマンド 2
- micro:bit 2
- Kali Linux 2
- Webサーバー 2
- MariaDB 2
- ドローン 2
- コンテナ 2
- DaVinci Resolve 2
- ネットワーク 2
- Java 2
- movie 2
- PCDJ 2
- 音楽 2
- XSERVER 2
- Ansible 1
- Vue.js 1
- JSON 1
- Bootstrap 1
- バージョン管理システム 1
- SSL 1
- S3 1
- ムームードメイン 1
- ネットワーク 1
- アニメーション 1
- D3.js 1
- Rhino 1
- アニメ 1
- git 1
- windows 1
- アクセス解析 1
- スマートフォン 1
- アフィリエイトノウハウ 1
- 知識 1
- TypeScript 1
- 役立つ本・書籍 1
- データサイエンス 1
- ESP32 1
- AI 1
- ownCloud 1
- API 1