Dies hängt mit dieser Frage zusammen: Django gibt je nach Client-Python json und html zurück
Ich habe eine Befehlszeilen-Python-API für eine Django-App. Wenn ich über die API auf die App zugreife, sollte sie JSON und mit einem Browser HTML zurückgeben. Ich kann verschiedene URLs verwenden, um auf die verschiedenen Versionen zuzugreifen. Wie kann ich jedoch die HTML-Vorlage und JSON in der Datei views.py mit nur einer Vorlage rendern ?
Um den HTML-Code zu rendern, würde ich Folgendes verwenden:
return render_to_response('sample/sample.html....')
Aber wie würde ich dasselbe für JSON tun, ohne eine JSON-Vorlage einzufügen? (das content-type
sollte application/json
statt sein text/html
)
Was würde die JSON- und HTML-Ausgaben bestimmen?
Also aus meiner Sicht .
if something:
return render_to_response('html_template',.....)
else:
return HttpReponse(jsondata,mimetype='application/json')
python
json
django
django-views
Neeran
quelle
quelle
Antworten:
Ich denke, das Problem ist verwirrt, was Sie wollen. Ich kann mir vorstellen, dass Sie nicht wirklich versuchen, den HTML-Code in die JSON-Antwort einzufügen, sondern alternativ entweder HTML oder JSON zurückgeben möchten.
Zunächst müssen Sie den Kernunterschied zwischen den beiden verstehen. HTML ist ein Präsentationsformat. Es geht mehr um die Anzeige von Daten als um die Daten selbst. JSON ist das Gegenteil. Es sind reine Daten - im Grunde eine JavaScript-Darstellung eines Python-Datensatzes (in diesem Fall), den Sie haben. Es dient lediglich als Austauschschicht, mit der Sie Daten aus einem Bereich Ihrer App (der Ansicht) in einen anderen Bereich Ihrer App (Ihr JavaScript) verschieben können, die normalerweise keinen Zugriff aufeinander haben.
In diesem Sinne "rendern" Sie JSON nicht und es sind keine Vorlagen beteiligt. Sie konvertieren lediglich alle im Spiel befindlichen Daten (höchstwahrscheinlich so ziemlich das, was Sie als Kontext an Ihre Vorlage übergeben) in JSON. Dies kann entweder über die JSON-Bibliothek von Django (simplejson) erfolgen, wenn es sich um Freiformdaten handelt, oder über das Serialisierungsframework, wenn es sich um ein Abfrageset handelt.
simplejson
Serialisierung
In beiden Fällen übergeben Sie diese Daten dann an die Antwort:
[Bearbeiten] In Django 1.6 und früheren Versionen war der Code für die Rückgabe der Antwort
quelle
request.is_ajax()
. Dies setzt jedoch voraus, dass derHTTP_X_REQUESTED_WITH
Header gesetzt ist. Die meisten JavaScript-Bibliotheken tun dies automatisch. Wenn Sie jedoch einen anderen Client-Typ verwenden, müssen Sie sicherstellen, dass dieser ebenfalls festgelegt wird. Alternativ können Sie einen Querystring wie?json
mit der URL übergeben und dann überprüfenrequest.GET.has_key('json')
, was wahrscheinlich etwas narrensicherer ist.import json ; json.dumps(data)
stattdessen.request
Objekt überprüfen . Siehe: w3.org/Protocols/rfc2616/rfc2616-sec14.html (großes Beispiel für einen Lesevorgang, aber ein vereinfachtes Codebeispiel könnte verwendet werden, um dies zu demonstrieren, und es wäre nicht sehr schwierig, ein unflexibles System zu schreiben, das dies zumindest tun würde behandeln Sie die zwei Fälle, die sie fragen)In Django 1.7 ist dies mit der integrierten JsonResponse noch einfacher.
https://docs.djangoproject.com/de/dev/ref/request-response/#jsonresponse-objects
quelle
Bei der JSON-Antwort muss keine Vorlage gerendert werden. Vorlagen dienen zum Generieren von HTML-Antworten. Der JSON ist die HTTP-Antwort.
Sie können jedoch HTML verwenden, das mit Ihrer JSON-Antwort aus einer Vorlage gerendert wird.
quelle
Es sieht so aus, als ob das Django REST-Framework den HTTP-Accept-Header in einer Anfrage verwendet, um automatisch zu bestimmen, welcher Renderer verwendet werden soll:
http://www.django-rest-framework.org/api-guide/renderers/
Die Verwendung des HTTP-Accept-Headers bietet möglicherweise eine alternative Quelle für Ihr "Wenn etwas".
quelle
Um meine Modelle in JSON in Django 1.9 zu rendern, musste ich in meinen views.py Folgendes tun:
quelle
Sie können auch überprüfen, ob die Anforderung den Inhaltstyp akzeptiert, wie im RFC angegeben. Auf diese Weise können Sie standardmäßig HTML rendern und wenn Ihr Client Anwendung / Jason akzeptiert, können Sie json in Ihrer Antwort zurückgeben, ohne dass eine Vorlage erforderlich ist
quelle
quelle
Hier ist ein Beispiel, das ich zum bedingten Rendern von JSON oder HTML je nach
Accept
Header der Anforderung benötigteSie können dies mit Curl oder httpie testen
Hinweis Ich habe mich für
JsonReponse
die Nichtverwendung entschieden, da dies das Modell unnötig reserialisieren würde .quelle
Wenn Sie das Ergebnis als gerenderte Vorlage übergeben möchten, müssen Sie eine Vorlage laden und rendern. Übergeben Sie das Ergebnis des Renderns an json. Dies könnte folgendermaßen aussehen:
Auf diese Weise können Sie eine gerenderte Vorlage als JSON an Ihren Client übergeben. Dies kann nützlich sein, wenn Sie vollständig ersetzen möchten, z. a enthält viele verschiedene Elemente.
quelle
render_to_string
ist eine Verknüpfung für die 3 "Rendern der Vorlage" Zeilen, und existiert seit Django 1.0