python json教學 - Django視圖返回json而不使用模板





template教學 request (9)


您還可以檢查rfc中指定的請求接受內容類型。 通過這種方式,您可以默認呈現HTML以及客戶端接受application / jason的位置,您可以在響應中返回json而無需模板

這與此問題有關: Django根據客戶端python返回json和html

我有一個django應用程序的命令行python api。 當我通過api訪問應用程序時它應該返回json並且使用瀏覽器它應該返回html。 我可以使用不同的URL來訪問不同的版本,但是如何使用一個模板在views.py中呈現html模板和json?

要呈現我將使用的HTML:

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

但是如果沒有放入json模板,我將如何為json做同樣的事情呢? (內容類型應該是application / json而不是text / html)

編輯1:

什麼會決定json和html輸出?

所以在我看來:

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

謝謝




這是我根據Request的Accept標頭有條件地呈現json或html所需的示例

# myapp/views.py
from django.core import serializers                                                                                
from django.http import HttpResponse                                                                                  
from django.shortcuts import render                                                                                   
from .models import Event

def event_index(request):                                                                                             
    event_list = Event.objects.all()                                                                                  
    if request.META['HTTP_ACCEPT'] == 'application/json':                                                             
        response = serializers.serialize('json', event_list)                                                          
        return HttpResponse(response, content_type='application/json')                                                
    else:                                                                                                             
        context = {'event_list': event_list}                                                                          
        return render(request, 'polls/event_list.html', context)

你可以用curl或httpie來測試它

$ http localhost:8000/event/
$ http localhost:8000/event/ Accept:application/json

注意我選擇不使用JsonReponse因為這會不必要地重新序列化模型 。




如果要將結果作為渲染模板傳遞,則必須加載並渲染模板,將渲染結果傳遞給json。這可能看起來像這樣:

from django.template import loader, RequestContext

#render the template
t=loader.get_template('sample/sample.html')
context=RequestContext()
html=t.render(context)

#create the json
result={'html_result':html)
json = simplejson.dumps(result)

return HttpResponse(json)

這樣,您可以將呈現的模板作為json傳遞給您的客戶端。 如果你想完全替換ie,這可能很有用。 包含許多不同的元素。




我認為這個問題已經與你想要的東西混淆了。 我想你實際上並沒有嘗試將HTML放在JSON響應中,而是想要返回HTML或JSON。

首先,您需要了解兩者之間的核心差異。 HTML是一種表現形式。 它更多地涉及如何顯示數據而不是數據本身。 JSON正好相反。 它是純數據 - 基本上是您擁有的某些Python(在本例中)數據集的JavaScript表示。 它僅用作交換層,允許您將數據從應用程序的一個區域(視圖)移動到應用程序的另一個區域(您的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')



from django.utils import simplejson 
from django.core import serializers 

def pagina_json(request): 
   misdatos = misdatos.objects.all()
   data = serializers.serialize('json', misdatos) 
   return HttpResponse(data, mimetype='application/json')









為了在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')



這將使第三方難以將JSON響應插入帶有<script>標記的HTML文檔中。 請記住, <script>標記不受同源策略的約束





python html django json