Django view возвращает json без использования шаблона

Это связано с этим вопросом:Django возвращает JSON и HTML в зависимости от клиентского Python

У меня есть командная строка Python API для приложения 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')

Спасибо

 Marcin13 февр. 2012 г., 15:49
Вы не читали мой ответ?
 Izkata13 февр. 2012 г., 15:55
@ Джимми, если это случилось, ты не должен был так быстро принять ответ Марцина на другой вопрос. Подождите, по крайней мере, день, кто-то, вероятно, ответил бы что-то вроде ответа Уку Лоскит
 Izkata13 февр. 2012 г., 15:54
@ Марчин Вы в основном сказали ему «Нет, не делай так», не показав ему пример правильного пути. Вот для чего этот ...
 Marcin13 февр. 2012 г., 15:59
@Izkata: Я действительно сказал ему, какую библиотеку использовать. Этот вопрос, кажется, имеет целью заставить кого-то другого написать свой код для него.

Ответы на вопрос(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')

ны для генерации 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")
 Uku Loskit13 февр. 2012 г., 15:45
simplejson.dumps () - это то, что делает сериализацию.
 Neeran13 февр. 2012 г., 15:44
Должен ли я сначала сериализовать объекты?

как указано в 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')

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

что среда REST Django использует заголовок HTTP accept в Запросе, чтобы автоматически определить, какой рендер использовать:

http://www.django-rest-framework.org/api-guide/renderers/

Использование заголовка HTTP accept может предоставить альтернативный источник для вашего «если что-то».

Решение Вопроса

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

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

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

[Edit] В Django 1.6 и более ранних версиях ответный код был

return HttpResponse(data, mimetype='application/json')
 Chris Pratt13 февр. 2012 г., 17:41
Вы можете использоватьrequest.is_ajax(), Но это требует, чтобыHTTP_X_REQUESTED_WITH заголовок установлен. Большинство библиотек JavaScript делают это автоматически, но если вы используете какой-либо другой тип клиента, вам необходимо убедиться, что он также устанавливает его. Кроме того, вы можете передать строку запроса, такую как?json с URL, а затем проверьтеrequest.GET.has_key('json'), что, вероятно, немного более надежно.
 Neeran13 февр. 2012 г., 17:39
Спасибо за разъяснения. Как мне определить в моих представлениях, что ответ на запрос по API для JSON? См редактировать на вопрос.
 Nopik13 окт. 2014 г., 18:05
В моем случае (Django 1.7) это был content_type = 'application / json', а не mimetype
 Yonatan30 апр. 2013 г., 01:59
Обратите внимание, что simplejson теперь считаетсяосуждается Django 1.5, использованиеimport json ; json.dumps(data) вместо.
 Merlyn Morgan-Graham20 авг. 2013 г., 08:41
OP должен проверить заголовок согласования типа контента «Accept» вrequest объект. Видеть:w3.org/Protocols/rfc2616/rfc2616-sec14.html (большая часть чтения, но для демонстрации можно использовать упрощенный пример кода, и было бы не очень сложно написать негибкую систему, которая по крайней мере справилась бы с двумя запрашиваемыми случаями)

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

 jpaugh15 февр. 2012 г., 03:27
В этот момент вы можете также использовать XML вместо JSON для обмена ...
 Izkata13 февр. 2012 г., 15:59
Как примечание стороны,render_to_string является ярлыком для 3 строк "render the template" и существует с Django 1.0

Ваш ответ на вопрос