Ich bin Anfänger im Django REST Framework und brauche Ihren Rat. Ich entwickle einen Webdienst. Der Dienst muss eine REST-Schnittstelle zu anderen Diensten bereitstellen. Die REST-Schnittstelle, die ich implementieren muss, funktioniert nicht direkt mit meinen Modellen (ich meine die Operationen get, put, post, delete). Stattdessen bietet es anderen Diensten einige Berechnungsergebnisse. Auf Anfrage führt mein Dienst einige Berechnungen durch und gibt nur die Ergebnisse zurück (speichert die Ergebnisse nicht in einer eigenen Datenbank).
Im Folgenden verstehe ich, wie diese REST-Schnittstelle implementiert werden kann. Korrigieren Sie mich, wenn ich falsch liege.
- Erstellen Sie eine Klasse, die die Berechnungen durchführt. Nennen Sie es 'CalcClass'. CalcClass verwendet die Modelle in seiner Arbeit.
- Die für die Berechnungen erforderlichen Parameter werden an den Konstruktor übergeben.
- Implementieren Sie die Berechnungsoperation. Es gibt Ergebnisse als 'ResultClass' zurück.
- ResultClass erstellen.
- Abgeleitet vom Objekt.
- Es enthält nur Attribute, die die Berechnungsergebnisse enthalten.
- Ein Teil der Berechnungsergebnisse wird als Tupel von Tupeln dargestellt. Soweit ich weiß, ist es für die weitere Serialisierung besser, eine separate Klasse für diese Ergebnisse zu implementieren und ResultClass eine Liste solcher Objekte hinzuzufügen.
- Erstellen Sie den Serializer für ResultClass.
- Ableiten von Serializers.Serializer.
- Die Berechnungsergebnisse sind schreibgeschützt. Verwenden Sie daher hauptsächlich Feldklassen für Felder anstelle von Spezialklassen wie IntegerField.
- Ich sollte die save () -Methode weder in ResultClass noch in Serializer implementieren, da ich die Ergebnisse nicht speichern werde (ich möchte sie nur auf Anfrage zurückgeben).
- Impl Serializer für verschachtelte Ergebnisse (denken Sie an das oben erwähnte Tupel Tupel).
- Ansicht erstellen, um Berechnungsergebnisse zurückzugeben.
- Ableiten von APIView.
- Muss nur bekommen ().
- Erstellen Sie in get () CalcClass mit Parametern, die aus der Anforderung abgerufen wurden, rufen Sie calc () auf, rufen Sie ResultClass ab, erstellen Sie Serializer und übergeben Sie die ResultClass an sie, und geben Sie Response (serializer.data) zurück.
- URLs
- In meinem Fall gibt es keine API-Wurzel. Ich sollte nur URLs haben, um verschiedene Berechnungsergebnisse zu erhalten (Berechnung mit diff-Parametern).
- Fügen Sie aufrufende format_suffix_patterns für das API-Browsing hinzu.
Habe ich etwas verpasst? Ist der Ansatz im Allgemeinen korrekt?
django
rest
django-rest-framework
Zakhar
quelle
quelle
Antworten:
Das Django-Rest-Framework funktioniert gut, auch ohne es an ein Modell zu binden. Ihr Ansatz klingt in Ordnung, aber ich glaube, Sie können einige der Schritte kürzen, um alles zum Laufen zu bringen.
Zum Beispiel enthält das Rest-Framework einige integrierte Renderer. Standardmäßig können JSON und XML an den API-Consumer zurückgegeben werden. Sie können YAML auch aktivieren, indem Sie einfach das erforderliche Python-Modul installieren. Das Django-Rest-Framework gibt alle grundlegenden Objekte wie Diktat, Liste und Tupel aus, ohne dass Sie zusätzliche Arbeit leisten müssen.
Grundsätzlich müssen Sie also nur die Funktion oder Klasse erstellen, die Argumente aufnimmt, alle erforderlichen Berechnungen durchführt und die Ergebnisse in einem Tupel an die REST-API-Ansicht zurückgibt. Wenn JSON und / oder XML Ihren Anforderungen entsprechen, übernimmt django-rest-framework die Serialisierung für Sie.
In diesem Fall können Sie die Schritte 2 und 3 überspringen und nur eine Klasse für Berechnungen und eine für die Präsentation für den API-Verbraucher verwenden.
Hier sind einige Ausschnitte, die Ihnen helfen können:
Bitte beachten Sie, dass ich dies nicht getestet habe. Es ist nur als Beispiel gedacht, aber es sollte funktionieren :)
Die CalcClass:
Die REST-Ansicht:
Ihre urls.py:
Dieser Code sollte eine Liste von Listen ausgeben, wenn Sie auf http://example.com/api/v1.0/resource/?format=json zugreifen . Bei Verwendung eines Suffix, können Sie ersetzen
?format=json
mit.json
. Sie können auch die Codierung angeben, die Sie durch Hinzufügen"Content-type"
oder"Accept"
zu den Headern zurückerhalten möchten .Hoffe das hilft dir weiter.
quelle
.model
oder keine.queryset
Eigenschaft hat." Ich habe das genaue Beispiel ausprobiert. Könnte es etwas mit der aktuellen Version von Django-Rest-Framework sein?In der urls.py erfordert die Funktion login_required
quelle
add a comment
Sitzung verwenden