Смотреть Джанго возвращается в формате JSON без использования шаблона



Это связано с этим вопросом: Django возвращает json и html в зависимости от клиента python



у меня есть api python командной строки для приложения django. Когда я получаю доступ к приложению через api, он должен возвращать json, а с браузером он должен возвращать html. Я могу использовать разные URL-адреса для доступа к разным версиям, но как я могу отобразить шаблон html и json в views.py только с одним шаблоном?



для визуализации 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')


спасибо

601   9  

9 ответов:

Я думаю, что этот вопрос запутался относительно того, что вы хотите. Я предполагаю, что вы на самом деле не пытаетесь поместить HTML в ответ JSON, а скорее хотите альтернативно вернуть либо HTML, либо JSON.

во-первых, вы должны понять основную разницу между ними. HTML-это презентационный формат. Он имеет дело больше с тем, как отображать данные, чем сами данные. JSON-это наоборот. Это чистые данные - в основном представление JavaScript некоторого Python (в данном случае) набор данных у вас есть. Он служит просто уровнем обмена, позволяя вам перемещать данные из одной области вашего приложения (представление) в другую область вашего приложения (ваш JavaScript), которые обычно не имеют доступа друг к другу.

имея это в виду, вы не "визуализируете" JSON, и нет никаких шаблонов. Вы просто конвертируете любые данные в игре (скорее всего, в значительной степени то, что вы передаете в качестве контекста в свой шаблон) в JSON. Что можно сделать с помощью JSON-библиотеки Django (simplejson), если это данные freeform или его структура сериализации, если это набор запросов.

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')

[Edit] в 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.

однако вы можете иметь HTML, который отображается из шаблона с вашим ответом JSON.

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 accept может предоставить альтернативный источник для вашего "если что-то".

для рендеринга моих моделей в JSON в django 1.9 мне пришлось сделать следующее В моем 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')

вы также можете проверить тип контента request accept, как указано в rfc. Таким образом, вы можете отображать по умолчанию HTML и где ваш клиент принимает приложение/jason вы можете вернуть 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')

Если вы хотите передать результат в виде отрисованного шаблона, который вы должны загрузить и отрисовать шаблон, передайте результат отрисовки в 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 для вашего клиента. Это может быть полезно, если вы хотите полностью заменить ИП. содержащий много различных элементов.

вот пример, который мне нужен для условного рендеринга json или html в зависимости от запроса Accept заголовок

# 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 как бы то ни было reserialize модель без необходимости.

Comments

    Ничего не найдено.