問題描述
這與這個問題有關:Django return json and html depending on client python
我有一個 django 應用程序的命令行 python api 。當我通過 api 訪問應用程序時,應該返回 json 並使用瀏覽器返回 html 。我可以使用不同的 URL 訪問不同的版本,但是如何使用只有一個模板在 views.py 中呈現 html 模板和 json?
要渲染我將使用的 html:
return render_to_response('sample/sample.html....)
但是,如果沒有放置 json 模板,我該怎麼做呢? (content-type 應該是 application /json 而不是 text /html)
編輯 1:
什麼會確定 json 和 html 輸出?
所以在我看來:
if something:
return render_to_response('html_template',.....)
else:
return HttpReponse(jsondata,mimetype='application/json')
謝謝
最佳解決方案
我認為這個問題對你的想法感到困惑。我想象你實際上並沒有將 HTML 放在 JSON 響應中,而是想要替代地返回 HTML 或 JSON 。
首先,你需要了解兩者的核心區別。 HTML 是一種表現形式。它更多地涉及如何顯示數據而不是數據本身。 JSON 是相反的它是純數據 – 基本上是一些 Python(在這種情況下) 數據集的 JavaScript 表示。它只是一個互換層,允許您將數據從應用程序 (視圖) 的一個區域移動到通常無法訪問的應用程序 (JavaScript) 的另一個區域。
考慮到這一點,您不需要”render” JSON,並且沒有涉及模板。您只需將 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')
次佳解決方案
在 Django 1.7 中,使用內置 JsonResponse 更容易。
https://docs.djangoproject.com/en/dev/ref/request-response/#jsonresponse-objects
# import it
from django.http import JsonResponse
def my_view(request):
# do something with the your data
data = {}
# just return a JsonResponse
return JsonResponse(data)
第三種解決方案
在 JSON 響應的情況下,沒有要渲染的模板。模板用於生成 HTML 響應。 JSON 是 HTTP 響應。
但是,您可以使用通過 JSON 響應從模板呈現的 HTML 。
html = render_to_string("some.html", some_dictionary)
serialized_data = simplejson.dumps({"html": html})
return HttpResponse(serialized_data, mimetype="application/json")
第四種方案
看起來 Django REST 框架在請求中使用 HTTP accept 標頭,以便自動確定要使用的渲染器:
http://www.django-rest-framework.org/api-guide/renderers/
使用 HTTP 接受頭可能為您的”if something” 提供了一個替代來源。
第五種方案
為了在 django 1.9 中以 JSON 格式呈現我的模型,我必須在我的 views.py 中執行以下操作:
from django.core import serializers
from django.http import HttpResponse
from .models import Mymodel
def index(request):
objs = Mymodel.objects.all()
jsondata = serializers.serialize('json', objs)
return HttpResponse(jsondata, content_type='application/json')
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。