1

JSON形式のファイルをコントローラーマシンに提供するDjangoサーバーがあります。私のサーバーはPOSTリクエストからデータを取得し、GETリクエストでJSONファイルを提供します。サーバー上にこのブリッジを作成するための最もRESTfulで効率的な方法は何ですか?

JSONモデルを作成し、POSTリクエストごとにデータベースにインスタンスを保存し、インスタンスを動的にJSONファイルにパックして、GETリクエストで提供することを検討しています。別の方法は、POSTリクエストでJSONファイルを作成し、サーバー上のフォルダーに保存して、GETリクエストでこれらのファイルを提供することです。

どちらが良いのか、そしてその理由は?それとも、完全に優れた方法が見当たらないのでしょうか。

4

2 に答える 2

0

なぜファイルを作成するのですか?DjangoビューにHTML応答の代わりにJSON応答を返すようにすることができます。

import json

# in your view:
data = {}
return HttpResponse(json.dumps(data), mimetype="application/json")

利用可能なデータから動的にJSONデータを構築し、JSON応答が大きい場合は、キャッシュを追加します(、、memcachedなどVarnish)。

これにより、特定の問題を防ぐことができます(GETリクエストが実行されたが、JSONファイルがまだない場合はどうすればよいですか?)。このようにして、所有しているデータに基づいてJSONを生成するか、代わりにエラーメッセージを含むJSONを返すことができます。

于 2012-06-21T20:27:38.520 に答える
0

シリアル化されるフィールドを制御するために、自然キーや依存関係などを使用したjsonシリアル化を調べました。また、ミドルウェアwodofstuffを使用して、より深い外部キーのシリアル化を可能にしてみました。ただし、JSON応答をレンダリングするためにテンプレートを使用することにしました。

いくつかの落とし穴は

  • 私はJSONのフォーマットを担当しています(セミコロンがないなどの間違いが発生しやすい)
  • 私はキャラクターをエスケープする責任があります
  • buit-inシリアル化よりもレンダリングが遅くなりますか?

いくつかの利点は

  • シリアル化されるものを制御できます(基になるモデルが変更された場合でも)
  • JSONファイルで多対多または外部キーの関係をフォーマットできますが、好きです

TLDL; 私の場合、必要なJSONファイルの形式は非常にカスタムでした。辞書のリストに辞書がありました。一部のフィールドは反復的であるため、テンプレートにforループを使用してレンダリングします。ただし、この形式では、ディクショナリとは対照的に、反復オブジェクトの一部のフィールドをリストにカプセル化する必要があります。

これは、simplejsonを検討しているときに遭遇した障害でした。のようなものを使用することによって

import simplejson as json
def encode_complex(obj):
    if isinstance(obj, complex):
        return [obj.real, obj.imag]
    raise TypeError(repr(o) + " is not JSON serializable")
json.dumps(2 + 1j, default=encode_complex)
'[2.0, 1.0]'

繰り返しデータを返すことができました。ただし、特定の反復をカプセル化するには、反復の反復とカスタムオブジェクトタイプ(listまたはdict)が必要でした。最後に(知識の欠如または忍耐力の欠如かもしれません)私はテンプレートでそれを行うことにしました。

テンプレートを介してレンダリングすることは、それを行うための最もスケーラブルまたは「最もスマートな」方法ではないように感じますが、おそらくより良い方法で行うことができますか?私が正しいか間違っているかを自由に証明してください。

于 2012-07-04T17:06:52.937 に答える