Wie kann ich die JSON zurückgeben, die ohne Vorlage in Django?
Dies ist im Zusammenhang mit dieser Frage: Django json zurückgeben und html, je nach client python
Habe ich ein Kommandozeilen-Python-API für eine Django-app. Wenn ich auf die app über die API, es sollte JSON zurückgeben und mit einem browser sollte es wieder HTML. Ich kann verschiedene URLs für den Zugriff auf die verschiedenen Versionen, aber wie kann ich das Rendern der HTML-Vorlage und JSON in den views.py mit nur einem template?
Zum Rendern der HTML, die ich benutzen würde:
return render_to_response('sample/sample.html....')
Aber wie würde ich das gleiche tun für JSON, ohne eine JSON-template? (die content-type
sollte application/json
statt text/html
)
Was würde bestimmen, JSON und HTML-Ausgaben?
Also in meinem views.py:
if something:
return render_to_response('html_template',.....)
else:
return HttpReponse(jsondata,mimetype='application/json')
- Hast du nicht gelesen, meine Antwort?
- Sie im Grunde sagte ihm, "Nein, Mach es nicht auf diese Weise", ohne dass ihn ein Beispiel für den richtigen Weg. Das ist es, was dieses scheint mir für...
- wenn es das ist, was passiert, sollte Sie nicht angenommen haben, Marcin Antwort auf die andere Frage nicht so schnell. Warten Sie mindestens einen Tag, jemand würde wahrscheinlich beantwortet haben, mit so etwas wie Uku Loskit Antwort
- Ich habe tatsächlich sagen Sie ihm, die Bibliothek zu benutzen. Diese Frage scheint für den Zweck des Erhaltens jemand anderes schreibt seinen code für ihn.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke das Thema ist mittlerweile verwirrt über das, was Sie wollen. Ich nehme an, du bist nicht wirklich der versucht, die HTML in JSON-Antwort, sondern Sie wollen eher alternativ Rückkehr entweder im HTML-oder JSON.
Erste, Sie brauchen, um zu verstehen, die Kern-Unterschied zwischen den beiden. HTML ist eine Präsentations-format. Es befasst sich mehr mit, wie die Anzeige von Daten als die Daten selbst. JSON ist das Gegenteil. Es ist Reine Daten-im Grunde ein JavaScript-Darstellung einiger Python (in diesem Fall) dataset ein, das Sie haben. Es dient lediglich als Austausch-Schicht, wodurch Sie zum verschieben von Daten von einem Bereich der app (der Blick) in einen anderen Bereich der app (JavaScript), die normalerweise keinen Zugang zu einander.
Mit diesem im Verstand, Sie nicht "render" - JSON -, und es gibt keine Vorlagen beteiligt. Sie nur konvertieren was auch immer die Daten im Spiel (wahrscheinlich ziemlich viel, was du bist vorbei wie der Kontext Ihrer Vorlage) zu JSON. Was kann getan werden, entweder über Django ' s JSON-Bibliothek (simplejson), wenn es Freiform-Daten, oder seine Serialisierungs-framework, wenn es ein queryset.
simplejson
Serialisierung
So oder so, Sie dann passieren, dass die Daten in der Antwort:
[Bearbeiten] In Django 1.6 und früher der code für die Rückgabe Antwort war
request.is_ajax()
. Aber das erfordert, dass dieHTTP_X_REQUESTED_WITH
- header gesetzt ist. Die meisten JavaScript-Bibliotheken tun dies automatisch, aber wenn Sie eine andere Art von client, Sie brauchen, um sicherzustellen, dass es Sätze gibt es auch. Alternativ können Sie ein querystring-wie?json
mit der URL und überprüfen Sie dannrequest.GET.has_key('json')
, das ist wahrscheinlich ein wenig mehr kinderleicht.import json ; json.dumps(data)
statt.request
Objekt. Siehe: w3.org/Protocols/rfc2616/rfc2616-sec14.html (big mamoth von einem lese -, sondern eine vereinfachte code-Beispiel könnte verwendet werden, um zu demonstrieren, und es wäre nicht sehr schwer zu schreiben, ein starres system, dass würde zumindest behandeln die beiden Fälle, die Sie gefragt haben)In Django 1.7 ist dies noch einfacher mit dem eingebauten JsonResponse.
https://docs.djangoproject.com/en/dev/ref/request-response/#jsonresponse-objects
Im Fall der JSON-Antwort gibt es keine Vorlage gerendert werden. Vorlagen sind für die Erstellung von HTML-Antworten. Die JSON HTTP-response.
Allerdings können Sie HTML gerendert wird aus einer Vorlage in Ihre JSON-Antwort.
Sieht es aus wie das Django REST framework verwendet den HTTP-accept-header in einer Anforderung, um automatisch zu bestimmen, welcher renderer:
http://www.django-rest-framework.org/api-guide/renderers/
Mithilfe des HTTP-accept-header kann eine alternative Quelle für Ihre ", wenn etwas".
Für die Darstellung meiner Modelle in JSON in django 1.9 ich hatte zu tun, die folgenden in meinem views.py:
Kannst du auch die Anfrage akzeptieren Inhaltstyp spezifiziert in rfc. So können Sie erbringen, indem Sie Standard-HTML-und wo Ihre Kunden akzeptieren, application/jason Sie zurückkehren können, json, in Ihrer Antwort ohne eine Vorlage erforderlich ist
Hier ist ein Beispiel brauchte ich für bedingt rendering json oder html je nach Anforderung
Accept
headertesten Sie dies mit curl oder httpie
Hinweis: ich entschied mich nicht zu verwenden
JsonReponse
als würde reserialize das Modell unnötig.Wenn Sie möchten, übergeben Sie das Ergebnis als gerenderte template zu laden und Rendern eines templates, übergeben Sie das Ergebnis zu Rendern, um das json-Format.Dies könnte beispielsweise so Aussehen:
Diese Weise können Sie eine gerenderte template als json zu Ihrem Kunden. Dies kann nützlich sein, wenn Sie möchten, um vollständig zu ersetzen, dh. eine mit vielen verschiedenen Elementen.
render_to_string
ist eine Abkürzung für die 3 "Rendern der Vorlage" Linien und existiert seit der Django 1.0