問題描述

這與這個問題有關: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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇