1. ホーム
  2. python

[解決済み] Django でテンプレートを使わずに JSON を返すには?

2023-06-12 02:22:52

質問

この質問に関連するものです。 DjangoはクライアントのPythonに応じてjsonとhtmlを返します。


私はDjangoアプリのコマンドラインPython APIを持っています。API を通してアプリにアクセスすると、JSON を返し、ブラウザでは HTML を返すはずです。異なるバージョンにアクセスするために異なるURLを使用することができますが、どのようにHTMLテンプレートとJSONを views.py でHTMLテンプレートとJSONをレンダリングするにはどうしたらいいですか?

HTMLをレンダリングするために、私は使用します。

return render_to_response('sample/sample.html....')

しかし、JSONのテンプレートを置かずに、JSONに対して同じことをするにはどうしたらいいでしょうか?(その content-typeapplication/json ではなく text/html )

JSONとHTMLの出力は何によって決まるのでしょうか?

では、私の views.py :

if something:
    return render_to_response('html_template',.....)
else:
    return HttpReponse(jsondata,mimetype='application/json')

どのように解決するのですか?

この問題は、あなたが何をしたいのかについて混乱していると思います。私は、あなたが実際に JSON 応答に HTML を配置しようとしているのではなく、むしろ HTML または JSON のいずれかを交互に返したいのだと想像しています。

最初に、この 2 つの間の中核的な違いを理解する必要があります。HTML はプレゼンテーションのためのフォーマットです。データそのものよりも、データをどのように表示するかを扱います。JSONはその反対です。JSONは純粋なデータで、基本的にはPython(この場合は)データセットをJavaScriptで表現したものです。JSON は単なる交換レイヤーとして機能し、通常は互いにアクセスできないアプリケーションのある領域 (ビュー) から別の領域 (JavaScript) にデータを移動できるようにします。

このことを念頭に置いて、JSON をレンダリングしたり、テンプレートを使用したりすることはありません。単に、実行中のあらゆるデータ(おそらく、テンプレートにコンテキストとして渡しているもの)をJSONに変換するだけです。これは、自由形式のデータであれば Django の JSON ライブラリ (simplejson) によって、クエリセットであればシリアライズフレームワークによって行うことができます。

simplejson

from django.utils import simplejson

some_data_to_dump = {
   'some_var_1': 'foo',
   'some_var_2': 'bar',
}

data = simplejson.dumps(some_data_to_dump)

シリアライズ

from django.core import serializers

foos = Foo.objects.all()

data = serializers.serialize('json', foos)

いずれにせよ、その後、そのデータをレスポンスに渡します。

return HttpResponse(data, content_type='application/json')

[編集] Django 1.6 以前のバージョンでは、レスポンスを返すためのコードは

return HttpResponse(data, mimetype='application/json')

[EDIT】です。] simplejson は django から削除されました。 を使用することができます。

import json

json.dumps({"foo": "bar"})

あるいは django.core.serializers を上述したように