[解決済み] Django でテンプレートを使わずに JSON を返すには?
質問
この質問に関連するものです。 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-type
は
application/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
を上述したように
関連
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] 改行やスペースを入れずに印刷する方法
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] JSONファイルをprettyprintする方法は?
-
[解決済み] JSONデータをファイルに書き込むにはどうしたらいいですか?
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Python 言語を決定するには?
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] 新しいpip backtrackingの実行時問題の解決