Pythonを使用してサーバーからiOSアプリにJSONを送信することは可能ですか?
このようなものはどのように実装されていますか?
(DjangoまたはFlaskで問題ありません)
オンラインで検索しましたが、PHPチュートリアルしか見つかりませんでした。
JSONを返そうとしましたが、機能しませんでした。少なくとも、アプリに送信されませんでした。
基本的な前提は、クライアントアプリがリクエストにURLを送信し、サーバーがJSONで応答することです。
JSONドキュメントを作成する方法はそれほど重要ではありません。任意の言語(JavaScriptも含む)を使用してJSONを生成し、送り返すことができます。
djangoには、 tastypie、django-rest、pistonがあります。
フラスコの場合は、 flask-restfulを使用できます。これが完全な例です。
使用するライブラリに関係なく、ワークフローは次のようになります。
ここで、 REST APIを実装する場合は、上記を拡張して、クライアントアプリからの操作を許可します。たとえば、特別に細工されたリクエストでは、新しいレコードを追加したり、レコードを削除したり、レコードのサブセットをクエリしたりできます。ただし、JSONドキュメントをアプリケーションに送り返すだけの場合は、これは必須ではありません。
フラスコには、jsonify
from flask import jsonify
@app.route("/index/", methods=['GET'])
def index():
return jsonify(result=result)
djangoを使用する場合は、次のことが役立つ場合があります。
#views.py
import json
from django.http import HttpResponse
def jsonview(request):
...
return HttpResponse(json.dumps(result), mimetype='application/json')
jsonを直接使用する代わりにさらに良い
from django.core.serializers import serialize
serialize('json', result) #instead of json.dumps(result)
djangoサーバーからJSONを返す例:
from django.http import HttpResponse, HttpResponseNotFound
class JsonResponse(HttpResponse):
def __init__(self, content, **kwargs):
kwargs['content_type'] = 'application/json'
super(JsonResponse, self).__init__(json.dumps(content), **kwargs)
class JsonDataResponse(HttpResponse):
"""
Returns a json dumped dict with fields 'message' and 'data'.
"""
def __init__(self, *args, **kwargs):
message = None
data = None
if len(args) > 0:
message = args[0]
if len(args) > 1:
data = args[1]
if 'message' in kwargs:
message = kwargs['message']
kwargs.pop('message')
if 'data' in kwargs:
data = kwargs['data']
kwargs.pop('data')
kwargs['content'] = json.dumps(dict(message=message, data=data))
if 'content_type' not in kwargs:
kwargs['content_type'] = 'application/json'
super(JsonDataResponse, self).__init__(**kwargs)
ビューの戻り値で上記で定義されたクラスを使用します。
from place.of.your.definition import JsonResponse
def example_view(request):
number_of_foo = Foo.objects.filter(...)
...
return JsonResponse({'number_of_foo': number_of_foo})