2012-02-13 2 views
54

Это связанного с этим вопросом: Django return json and html depending on client pythonДжанго вида возвращение JSON без использования шаблона

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

Оказать HTML я хотел бы использовать:

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

Но как бы я сделать то же самое для JSON, не помещая шаблон JSon? (Тип содержимого должен быть приложения/JSON вместо текста/HTML)

Edit 1:

Что бы определить JSon и HTML выходы?

Так что в моих взглядах:

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

Спасибо

+0

Разве вы не читали мой ответ? – Marcin

+0

@ Марцин Вы в основном сказали ему: «Нет, не делайте этого так», не показывая ему пример правильного пути. Вот что это, по-видимому, для ... – Izkata

+0

@Jimmy, если это так, вы не должны так быстро принимать ответ Марцина по другому вопросу. Подождите, по крайней мере, один день, кто-то, вероятно, ответил бы с чем-то вроде ответа Уку Лоскита. – Izkata

ответ

107

Я думаю, что проблема запуталась в отношении того, что вы хотите. Я предполагаю, что вы на самом деле не пытаетесь поместить 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 и еа rlier, код для возврата ответа был

return HttpResponse(data, mimetype='application/json') 
+0

Thank вы для уточнения. Как определить в моих представлениях, что запрос ответа является api для json? См. Edit on question. – Neeran

+1

Вы можете использовать 'request.is_ajax()'. Но для этого требуется заголовок 'HTTP_X_REQUESTED_WITH'. Большинство библиотек JavaScript делают это автоматически, но если вы используете какой-то другой тип клиента, вам нужно убедиться, что он также устанавливает его. Кроме того, вы можете передать запрос, например '? Json', с URL-адресом, а затем проверить' request.GET.has_key ('json') ', что, вероятно, немного более надежным. –

+14

Обратите внимание, что simplejson теперь считается [устаревшим Django 1.5] (https://docs.djangoproject.com/en/dev/releases/1.5/#system-version-of-simplejson-no-longer-used). Используйте 'import json; json.dumps (data) 'вместо этого. – Yonatan

7

В случае ответа 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") 
+0

Нужно ли сначала сериализовать объекты? – Neeran

+0

simplejson.dumps() - это то, что делает сериализация. –

0

Если вы хотите передать результат в виде оказанной шаблона вы должны загрузить и сделать шаблон, передать результат рендеринга его к json.This может выглядеть так:

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. содержащий множество разных элементов.

+1

В качестве побочного примечания 'render_to_string' является ярлыком для 3-х строк рендеринга шаблона и существует с тех пор, как Django 1.0 – Izkata

+0

В этом случае вы можете использовать XML вместо JSON для обмена ... – jpaugh

2

Вы также можете проверить тип содержимого запроса, как указано в rfc. Таким образом, вы можете отображать по умолчанию HTML и когда ваш клиент принимает приложение/jason, вы можете вернуть json в свой ответ без необходимости в шаблоне

7

Похоже, что структура Django REST использует заголовок Accept HTTP в запросе, чтобы автоматически определяет, какое средство визуализации для использования:

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

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

+0

Ссылка не работает. – Ajoy

+1

Спасибо ... только что обновил его. –

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

Для визуализации моих моделей в формате JSON в Джанго 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') 
Смежные вопросы