django-simple-Rest ist ein sehr leichter Rahmen, der nur die Grundzüge Grundlagen dessen, was erforderlich ist, um RESTful APIs oben auf Django erstellen bietet.
Installation
1. Installieren Sie mit pip oder easy_install:
- Pip installieren Ruhe oder easy_install Rest installieren
2. Fügen Sie den ExceptionMiddleware in die Liste der Middleware-Klassen (optional):
- MIDDLEWARE_CLASSES + = ['rest.exceptions.ExceptionMiddleware']
- Dieser Schritt ist optional und wird nur benötigt, wenn Sie in der Lage, ein httperror aus einer Ansicht zu erhöhen wollen.
3. Fügen Sie das Paket in der Liste der installierten Anwendungen (optional):
- INSTALLED_APPS + = ['Rest']
- Dieser Schritt ist optional und wird nur benötigt, wenn Sie sich mit dem mitgelieferten Spezial Django-Befehl (e) zu planen.
Warum weiterer REST Framework?
Das ist eine gute Frage, und die einfachste Antwort darauf ist, dass dies wirklich nicht ein Rahmen überhaupt, aber lassen Sie mich erklären, ein wenig weiter.
Mit der Einführung der klassenbasierten Ansichten in der Version 1.3 von Django, hat das Web-Framework fast alles, was es braucht, um RESTful APIs erstellen gebaut, aber nur ein paar Dinge fehlen. Dieser "Rahmen" liefert die letzten paar Dinge.
Stellen Sie sich einfach REST wie der Code, die Sie geschrieben haben, um klassenbasierte Ansichten richtig funktioniert als Plattform für die REST-API Entwicklung zu bekommen. Bei von diesem Blick sah, Sie beginnen zu verstehen, was Einfache REST1 ist; es ist eine Sammlung von Code, der es möglich, RESTful APIs mit Djangos klassenbasierte Ansichten, nicht mehr und nicht weniger zu schaffen macht.
Wenn Sie die Erstellung Ihrer API von Hand arbeitenden über jeden letzten URL mögen, dann ist dies der Rahmen für Sie. Wenn Sie etwas ein wenig mehr voll funktions, die Schaffung von großen Schwaden des API von Django-Modelle und solche Dinge behandelt werden soll, lassen Sie mich vorschlagen, ein paar ausgezeichnete Rahmenbedingungen: Tastypie, Kolben, und Django REST.
Wie verwende ich es?
Es gibt nichts, um es, es funktioniert wie Sie es erwarten würde --- vorausgesetzt, Sie sind mit Djangos Klasse basierte Ansichten vertraut sind. Werfen wir einen Blick auf ein Beispiel:
# ===============
# Views.py
# ===============
Import Regal
Import json
von django.http Importhttpresponse
vom Rest Importressourcen
von rest.exceptions importieren httperror
Klasse MyResource (Resource):
& Nbsp; def bekommen (self, Anfrage, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; data = dict (db)
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (json.dumps (Daten), content_type = "application / json ', status = 200)
& Nbsp; def verfassen (self, Anfrage, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; name = request.POST.get ('name', '')
& Nbsp; db [name] = True
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (Status = 201)
& Nbsp; def löschen (self, Anfrage, Name):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; wenn nicht db.has_key (str (name)):
& Nbsp; db.close ()
& Nbsp; erhöhen httperror ('Name existiert nicht', status = 404)
& Nbsp; del (db [name])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (Status = 200)
So ist in dem Beispiel views.py oben, wir die Ressourcenklasse, die einfach erbt von Djangos View-Klasse und stellt die zusätzliche Sauce auf alle HTTP-Methoden ordnungsgemäß zu importiert haben. Dann erstellen wir eine neue Klasse, die aus dem Resource-Klasse erbt, und wir eine Funktion hinzufügen, um unsere neue Klasse, jede HTTP-Methode, die wir zulassen möchten behandeln. Die einzige Voraussetzung ist, dass der Name der Funktion muss die HTTP-Methode Namen übereinstimmen, so erhalten oder für einen GET Aufruf und so weiter. Einfach genug, oder? Also, lasst uns sehen, wie den Anschluss unserer Ressourcen:
# ===============
# Urls.py
# ===============
von django.conf.urls Importmuster umfassen, URL
von .views Import MyResource
urlpatterns = Muster ('',
& Nbsp; url (r '? ^ Api / Ressourcen / $', MyResource.as_view ()),
& Nbsp; url (r '? ^ Api / Ressourcen / (P [a-zA-Z -] +) / $', MyResource.as_view ()),
)
Die Probe urls.py oben zeigt genau, wie wir über die Schaffung der URL-Muster für unser Beispiel Ressource zu gehen. Auch wenn Sie mit Django-Klasse basierte Ansichten vertraut sind, sollte es keine Überraschungen.
Authentication
Und was ist die Authentifizierung? Nun, man könnte einfach die method_decorator Funktion wie die Django docs vorschlagen, jede Methode in der Ressource mit der entsprechenden Authentifizierungs Dekorateur schmücken. Angenommen, Sie möchten die gesamte Ressource geschützt können Sie auch das Ergebnis des Aufrufs zu schmücken, um in der URLconf as_view. Beide Optionen sind vollständig gültig und Sie können sich gerne an sie zu benutzen, dieser Rahmen tut bieten eine weitere Option, aber.
Im rest.auth.decorators Modul werden Sie Dekorateure dort feststellen, dass Sie verwenden können, um die Authentifizierung zu Ihren Ressourcen hinzufügen. Werfen wir einen Blick auf ein paar Beispiele mit unseren Beispielcode von oben:
# ===============
# Views.py
# ===============
Import Regal
Import json
von django.http Importhttpresponse
vom Rest Importressourcen
von rest.exceptions importieren httperror
von rest.auth.decorators importieren login_required, admin_required
Klasse MyResource (Resource):
& Nbsp; def bekommen (self, Anfrage, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; data = dict (db)
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (json.dumps (Daten), content_type = "application / json ', status = 200)
& Nbsp;login_required
& Nbsp; def verfassen (self, Anfrage, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; name = request.POST.get ('name', '')
& Nbsp; db [name] = True
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (Status = 201)
& Nbsp;admin_required
& Nbsp; def löschen (self, Anfrage, Name):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; wenn nicht db.has_key (str (name)):
& Nbsp; db.close ()
& Nbsp; erhöhen httperror ('Name existiert nicht', status = 404)
& Nbsp; del (db [name])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (Status = 200)
Unter der Annahme, dass wir nichts dagegen, wenn jemand unseren Namen sieht, können wir, dass man unverändert lassen, aber lassen Sie uns annehmen, dass wir hohe Anforderungen an die Namen hinzufügen und löschen können. Unter der Annahme, dass nur registrierte Benutzer Namen hinzufügen, die login_required Dekorateur fügen wir der Post-Methode. Wir haben nichts dagegen, wenn irgendwelche unserer Mitglieder hinzufügen, neue Namen, aber wir wollen nicht, dass ein Name, der zufällig aus unserer Datenbank gelöscht werden, also lasst uns schmücken, dass man anders mit dem admin_required Dekorateur. einfach admin_required sorgt dafür, dass der Benutzer angemeldet ist und eine Super-User, bevor sie Zugriff auf das View-Funktion gewährt.
Jetzt können Sie diese bekommen ein bisschen langweilig, wenn wir viele Ressourcen, und sie alle sind in der Regel die gleichen Authentifizierungsanforderungen. So arbeiten die Authentifizierung Dekorateure auf beiden Klassen und Methoden. In dem folgenden Beispiel werden wir das Hinzufügen einer Superuser-Anforderungen an jeden von der Ressource angeboten Verfahren einfach durch die Ressourcenklasse schmücken:
# ===============
# Views.py
# ===============
Import Regal
Import json
von django.http Importhttpresponse
vom Rest Importressourcen
von rest.exceptions importieren httperror
von rest.auth.decorators Import admin_required
admin_required
Klasse MyResource (Resource):
& Nbsp; def bekommen (self, Anfrage, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; data = dict (db)
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (json.dumps (Daten), content_type = "application / json ', status = 200)
& Nbsp; def verfassen (self, Anfrage, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; name = request.POST.get ('name', '')
& Nbsp; db [name] = True
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (Status = 201)
& Nbsp; def löschen (self, Anfrage, Name):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; wenn nicht db.has_key (str (name)):
& Nbsp; db.close ()
& Nbsp; erhöhen httperror ('Name existiert nicht', status = 404)
& Nbsp; del (db [name])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (Status = 200)
Bevor wir das Thema der Authentifizierung Dekorateure lassen gibt es zwei weitere Artikel möchte ich darauf hinweisen. Erstens, ein weiterer guter Grund für die Verwendung von Authentifizierungs Dekorateure des Frameworks, wann immer möglich, dass, wenn die Authentifizierung fehlschlägt sie die richtige Antwort aus einer RESTful Sicht zurückzukehren. Die typischen Django Authentifizierung Dekorateure werden versuchen, den Benutzer auf die Login-Seite umgeleitet werden. Dies ist zwar toll, wenn man auf einer Webseite sind, beim Zugriff auf die Ressource von einem anderen Client-Typ, erhalten eine 401 (Unauthorized) ist die bevorzugte Reaktion und die, die bei der Verwendung von einfachen REST-Authentifizierung Dekorateure zurückgegeben wird.
Der andere Punkt ich erwähnen möchte, ist die Authentifizierung signature_required Dekorateur. Viele APIs verwenden eine sichere Signatur, um einen Benutzer zu identifizieren und so haben wir eine Authentifizierungs Dekorateur, die diese Funktionalität, um Ihre Ressourcen hinzufügen, werden aufgenommen. Die signature_required Dekorateur wird erwartet, dass ein HMAC, wie von RFC 2104 definiert sind, mit der HTTP-Anforderung, um den Benutzer zu authentifizieren gesendet. Ein HMAC ist um geheime Schlüssel des Benutzers durch den Dekorator mit einer Funktion, die eine Django Httprequest-Objekt und eine beliebige Anzahl von Positions- und Keyword nimmt gebaut und so muss es einen Weg für die signature_required Dekorateur, diesen geheimen Schlüssel zu bekommen und dies geschehen ist Argumente, wie sie in der URLconf definiert. Werfen wir einen Blick auf ein Beispiel für die Verwendung der signature_required Dekorateur mit unseren Beispielressourcencode:
# ===============
# Views.py
# ===============
Import Regal
Import json
von django.http Importhttpresponse
vom Rest Importressourcen
von rest.exceptions importieren httperror
von rest.auth.decorators importieren signature_required
def secret_key (Anfrage, * args, ** kwargs):
& Nbsp; user = User.objects.get (pk = kwargs.get ('uid'))
& Nbsp; Rück user.secret_key
signature_required (secret_key)
Klasse MyResource (Resource):
& Nbsp; def bekommen (self, Anfrage, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; data = dict (db)
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (json.dumps (Daten), content_type = "application / json ', status = 200)
& Nbsp; def verfassen (self, Anfrage, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; name = request.POST.get ('name', '')
& Nbsp; db [name] = True
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (Status = 201)
& Nbsp; def löschen (self, Anfrage, Name):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; wenn nicht db.has_key (str (name)):
& Nbsp; db.close ()
& Nbsp; erhöhen httperror ('Name existiert nicht', status = 404)
& Nbsp; del (db [name])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; zurück Httpresponse (Status = 200)
Es gibt auch eine andere Dekorateur namens auth_required, die auf die gleiche Weise arbeitet wie die signature_required (was bedeutet, dass es eine Funktion, die einen geheimen Schlüssel und kehrt nimmt), aber das erfordert, dass der Benutzer entweder angemeldet oder eine gültige Signatur, bevor ihnen Zugang zu die Ressource.
Schließlich wenn Sie mit den signature_required oder auth_required Dekorateur in Ihrem Code und müssen ein wenig zusätzliche Hilfe Debuggen von Ressourcen, die speziell Ihnen helfen erzeugen eine sichere Signatur benötigen, bietet einfachen REST einen benutzerdefinierten Befehl genannt urlencode, die eine Reihe von Daten als Schlüssel nimmt / Wert-Paare und eine optionale geheimen Schlüssel und sendet eine URL-codierte Zeichenfolge, die Sie direkt in ein cURL-Befehl oder andere hilfreiche Tools wie der REST-Konsole für Chrome kopieren. Ein Beispiel, wie der Befehl urlencode verwenden ist unten aufgelistet:
% Python manage.py urlencode --secret-key = Test foo = 1 bar = 2 baz = 3 name = 'Maxwell Hammer'
Formularüberprüfung
Wenn Sie ein Formular verwenden, um die Daten in einer REST Anfrage überprüfen möchten (zB ein POST, um eine neue Ressource zu erstellen) können Sie in einige Probleme mit Django Modelform-Klasse laufen. Insbesondere nehmen wir an, dass Sie ein Modell, das mehrere optionale Attribute mit angegebenen Standardwerte verfügt. Wenn Sie eine Anforderung an eine neue Instanz dieser Klasse erstellen können, sondern nur Daten für eine Handvoll der optionalen Attribute, die Sie erwarten würden, dass das Formular Objekt, das Sie erstellen, wäre es nicht versäumen Validierung seit dem Speichern des Objekts würde bedeuten, dass der neue Datensatz würde einfach am Ende mit den Standardwerten für die fehlenden Attribute. Dies ist jedoch nicht der Fall mit Django Modelform Klasse. Es wird erwartet, alle Daten in jeder Anfrage sehen und schlägt fehl, wenn etwas fehlen.
Um dieses Problem zu lösen, stellt die einfache REST Rahmen einer Modelform-Klasse in rest.forms, die von Django Modelform erbt und initialisiert die eingehende Anforderung mit den Standardwerten aus dem zugrunde liegenden Modellobjekt für alle fehlenden Attribute. Dies ermöglicht es dem Formularvalidierung um korrekt zu arbeiten und für das neue Objekt mit nur einem Teil des vollständigen Satz von Attributen innerhalb der Anfrage gesendet gespeichert werden. Um die Klasse zu verwenden, einfach importieren Sie anstelle des normalen Django Modelform und lassen Sie Ihre Formularklasse erben von ihm statt Djangos.
Bevorstehende
Halten Sie Ausschau nach Updates zu Rahmen. Während es ursprünglich mit der Idee, nur das absolute Minimum benötigt, um Djangos klassenbasierte Ansichten für die Erstellung von REST-APIs erstellt, gibt es noch ein paar nette Features, die wir im Prozess des Hinzufügens, dass wir denken, wird das Gerüst gut ergänzen sind während immer noch wahr, unsere minimalistischen Idealen. Die aufregendste dieser Updates wird der Zusatz von alternative Inhalte für Antworten von Erträgen werden
Anforderungen .
- Python
- Django
Kommentare nicht gefunden