Смотреть Джанго возвращается в формате 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')
спасибо
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