django-simple-resten er en meget let ramme, der giver kun de nøgne knogler grundlæggende i, hvad der er behov for at skabe RESTful API'er på toppen af Django.
Installation
1. Installer hjælp pip eller easy_install:
- Pip installere hvile eller easy_install installere hvile
2. Tilsæt ExceptionMiddleware til listen over middleware klasser (valgfrit):
- MIDDLEWARE_CLASSES + = ['rest.exceptions.ExceptionMiddleware']
- Dette trin er valgfrit og er kun nødvendig, hvis du vil være i stand til at rejse en HttpError fra en visning.
3. Tilsæt pakke til listen over installerede apps (valgfrit):
- INSTALLED_APPS + = ['hvile']
- Dette trin er valgfrit og er kun nødvendig, hvis du planlægger at bruge den medfølgende brugerdefinerede django kommando (er).
Hvorfor andet hvil Framework?
Det er et godt spørgsmål, og det enkleste svar på det er, at dette virkelig er ikke en ramme på alle, men lad mig forklare lidt længere.
Med indførelsen af klasse-baserede synspunkter i version 1.3 af Django, har næsten alt det behov indbygget i skabe RESTful API'er, men bare mangler et par ting på internettet rammer. Denne "ramme" leverer de sidste par ting.
Tænk på Simple resten som den kode, som du ville have skrevet at få klassebaserede synspunkter fungerer korrekt som en platform for RESTful API udvikling. Set fra dette synspunkt, du begynder at forstå, hvad Simple REST1 er; Det er en samling af kode, der gør det muligt at skabe RESTful API'er med Django 's klasse-baserede udsigt, intet mere og intet mindre.
Hvis du kan lide at skabe din API i hånden, arbejdede over hver sidste URL, så er rammerne for dig. Hvis du vil have noget lidt mere fuld featured, der håndterer skabe store skår af din API fra Django modeller og sådan noget, så lad mig foreslå et par gode rammer: Tastypie, stempel, og Django Rest.
Hvordan bruger jeg det?
Der er ikke noget til det, det virker ligesom du ville forvente at --- forudsat du er fortrolig med Django klasse baserede synspunkter. Lad os tage et kig på et eksempel:
# ===============
# Views.py
# ===============
import skrinlægge
import JSON
fra django.http import HttpResponse
fra resten import Resource
fra rest.exceptions importerer HttpError
klasse MyResource (Resource):
& Nbsp; def få (selv-, anmodning, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; data = dict (db)
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (json.dumps (data), CONTENT_TYPE = 'application / JSON «, status = 200)
& Nbsp; def bogføre (selv-, anmodning, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; name = request.POST.get ('navn', '')
& Nbsp; db [navn] = true
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (status = 201)
& Nbsp; def slette (selv, anmodning, navn):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; hvis ikke db.has_key (str (navn)):
& Nbsp; db.close ()
& Nbsp; hæve HttpError ('findes ikke ", status = 404)
& Nbsp; del (db [navn])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (status = 200)
Så i eksemplet views.py ovenfor har vi importeret Resource klasse, der blot arver fra Django visning klasse og giver den ekstra sauce at få alle HTTP metoder fungerer korrekt. Så skaber vi en ny klasse, der arver fra Resource klassen, og vi tilføjer en funktion til vores nye klasse til at håndtere hver HTTP metode, vi vil tillade. Det eneste krav er, at funktionen skal matche HTTP metode navn, så får eller få til en GET opkald og så videre. Simpelt nok, ikke? Så lad os se, hvordan du tilslutte vores ressource:
# ===============
# Urls.py
# ===============
fra django.conf.urls import- mønstre, omfatter, url
fra .views import MyResource
urlpatterns = mønstre ('',
& Nbsp; url (r «? ^ Api / ressource / $ ', MyResource.as_view ()),
& Nbsp; url (R '?? ^ Api / ressource / (P [a-zA-Z -] +) / $', MyResource.as_view ()),
)
Prøven urls.py ovenfor viser præcis, hvordan vi ville gå om at skabe webadressemønstrene for vores eksempel ressource. Igen, hvis du er fortrolig med Django klasse baserede synspunkter, bør der ikke være nogen overraskelser her.
Godkendelse
Så hvad med autentificering? Nå, kan du blot bruge method_decorator funktion som Django docs tyder at dekorere hver metode i din ressource med den relevante godkendelse dekoratør. Forudsat, at du vil have det hele ressource beskyttede du kan også dekorere resultatet af opkaldet til as_view i URLconf. Begge disse muligheder er helt gyldige, og du kan føle dig fri til at bruge dem, det rammer ikke giver en anden mulighed, dog.
I rest.auth.decorators modul finder du dekoratører der, som du kan bruge til at tilføje godkendelse til dine ressourcer. Lad os tage et kig på nogle eksempler ved hjælp af vores eksempelkode fra ovenstående:
# ===============
# Views.py
# ===============
import skrinlægge
import JSON
fra django.http import HttpResponse
fra resten import Resource
fra rest.exceptions importerer HttpError
fra rest.auth.decorators importere login_required, admin_required
klasse MyResource (Resource):
& Nbsp; def få (selv-, anmodning, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; data = dict (db)
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (json.dumps (data), CONTENT_TYPE = 'application / JSON «, status = 200)
& Nbsp;login_required
& Nbsp; def bogføre (selv-, anmodning, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; name = request.POST.get ('navn', '')
& Nbsp; db [navn] = true
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (status = 201)
& Nbsp;admin_required
& Nbsp; def slette (selv, anmodning, navn):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; hvis ikke db.has_key (str (navn)):
& Nbsp; db.close ()
& Nbsp; hæve HttpError ('findes ikke ", status = 404)
& Nbsp; del (db [navn])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (status = 200)
Antages det, at vi ikke har noget imod, hvis nogen ser vores samling af navne, kan vi lade, at man som det er, men lad os antage, at vi har strenge krav til, hvem der kan tilføje og slette navne. Under antagelse af, at kun registrerede brugere kan tilføje navne, vi tilføjer login_required dekoratør til stillingen metoden. Vi har ikke noget imod, hvis nogen vores medlemmer tilføjer nye navne, men vi ønsker ikke et navn, der skal uheld slettet fra vores database, så lad os dekorere at man anderledes med admin_required dekoratør. admin_required blot sørger for, at brugeren er logget ind og er superbruger, før de får adgang til visningen funktionen.
Nu kan dette få en smule kedelig, hvis vi har masser af ressourcer, og de alle har tendens til at have de krav samme autentificering. Så autentificering dekoratører arbejde på begge klasser og metoder. I nedenstående eksempel vi tilføjer en superbruger krav om at hver metode, der tilbydes af ressourcen blot ved at dekorere ressourcen klasse:
# ===============
# Views.py
# ===============
import skrinlægge
import JSON
fra django.http import HttpResponse
fra resten import Resource
fra rest.exceptions importerer HttpError
fra rest.auth.decorators import admin_required
admin_required
klasse MyResource (Resource):
& Nbsp; def få (selv-, anmodning, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; data = dict (db)
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (json.dumps (data), CONTENT_TYPE = 'application / JSON «, status = 200)
& Nbsp; def bogføre (selv-, anmodning, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; name = request.POST.get ('navn', '')
& Nbsp; db [navn] = true
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (status = 201)
& Nbsp; def slette (selv, anmodning, navn):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; hvis ikke db.has_key (str (navn)):
& Nbsp; db.close ()
& Nbsp; hæve HttpError ('findes ikke ", status = 404)
& Nbsp; del (db [navn])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (status = 200)
Inden vi forlader emnet autentificering dekoratører er der to flere elementer jeg gerne vil påpege. Først en anden god grund til at bruge disse rammer autentificering dekoratører vidt muligt er, at når godkendelse mislykkes de vender den rigtige reaktion fra en afslappende synspunkt. De typiske Django autentificering dekoratører vil forsøge at omdirigere brugeren til login-siden. Mens dette er stor, når du er på en webside, ved adgang til ressourcen fra enhver anden form for klient, der modtager en 401 (Uautoriseret) er den foretrukne respons og en, der er vendt tilbage, når du bruger Simple REST authentication dekoratører.
Det andet punkt, jeg vil nævne, er den signature_required autentificering dekoratør. Mange API'er bruge en sikker signatur til at identificere en bruger og så vi har tilføjet en godkendelse dekoratør, der vil tilføje, at funktionalitet til dine ressourcer. Den signature_required dekoratør vil forvente, at en HMAC, som defineret af RFC 2104, sendes med HTTP-anmodning for at godkende brugeren. En HMAC er bygget op omkring en brugers hemmelige nøgle og så er der behov for en måde for signature_required dekoratør at få det hemmelige nøgle og det er gjort ved at give den dekoratør med en funktion, der tager et Django HttpRequest objekt og et vilkårligt antal positionelle og søgeord argumenter som defineret af URLconf. Lad os tage et kig på et eksempel på anvendelse af signature_required dekoratør med vores prøve ressource-kode:
# ===============
# Views.py
# ===============
import skrinlægge
import JSON
fra django.http import HttpResponse
fra resten import Resource
fra rest.exceptions importerer HttpError
fra rest.auth.decorators importerer signature_required
def secret_key (anmodning * args, ** kwargs):
& Nbsp; user = User.objects.get (pk = kwargs.get (uid))
& Nbsp; tilbagevenden user.secret_key
signature_required (secret_key)
klasse MyResource (Resource):
& Nbsp; def få (selv-, anmodning, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; data = dict (db)
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (json.dumps (data), CONTENT_TYPE = 'application / JSON «, status = 200)
& Nbsp; def bogføre (selv-, anmodning, * args, ** kwargs):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; name = request.POST.get ('navn', '')
& Nbsp; db [navn] = true
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (status = 201)
& Nbsp; def slette (selv, anmodning, navn):
& Nbsp; db = shelve.open ('/ tmp / db)
& Nbsp; hvis ikke db.has_key (str (navn)):
& Nbsp; db.close ()
& Nbsp; hæve HttpError ('findes ikke ", status = 404)
& Nbsp; del (db [navn])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; returnere HttpResponse (status = 200)
Der er også en anden dekoratør kaldet auth_required der virker på samme måde som signature_required (hvilket betyder, at det tager en funktion, der returnerer en hemmelig nøgle samt), men det kræver, at brugeren enten logget ind eller har en gyldig signatur, før de får adgang til ressourcen.
Endelig, hvis du bruger den signature_required eller auth_required dekoratør i din kode og har brug for lidt ekstra hjælp debugging dine ressourcer, specielt du brug for hjælp at generere et sikkert signatur, Simple REST giver en brugerdefineret kommando kaldet urlencode der tager et sæt data som nøgle / værdi-par og en valgfri hemmelige nøgle og returnerer en URL kodet streng, som du kan kopiere og indsætte direkte i en krølle kommando eller andre nyttige værktøj som REST Console til Chrome. Et eksempel på, hvordan du bruger urlencode kommandoen angivet nedenfor:
% Python manage.py urlencode --secret-key = test foo = 1 bar = 2 baz = 3 name = "Maxwell Hammer '
Form Validering
Hvis du ønsker at bruge en formular til at validere data i et REST anmodning (fx en POST til at oprette en ny ressource) kan du løbe ind i nogle problemer med at bruge Djangos ModelForm klasse. Konkret lad os antage at du har en model, der har flere valgfrie attributter med standardværdier angivet. Hvis du sender en anmodning om at oprette en ny instans af denne klasse, men kun indeholde data for en håndfuld af de valgfrie attributter, du ville forvente, at formularen objekt, du opretter ville ikke svigte validering da redde genstanden ville betyde, at den nye plade ville simpelthen ender med standardværdierne for de manglende attributter. Dette er imidlertid ikke tilfældet med Djangos ModelForm klasse. Det forventer at se alle data i hver anmodning og vil mislykkes, hvis nogen mangler.
For at løse dette problem, Simple REST rammer giver en ModelForm klasse i rest.forms der arver fra Djangos ModelForm og initialiserer den indkommende anmodning med standardværdierne fra den underliggende model objekt for forsvundne attributter. Dette gør det muligt at validere formularen til at fungere korrekt, og for det nye objekt, der skal gemmes med kun en del af det komplette sæt af attributter, der sendes i anmodningen. Hvis du vil bruge klassen, skal du blot importere det i stedet for den normale Django ModelForm og få din formular klasse arve fra det i stedet for Django er.
Kommende
Hold på udkig efter opdateringer til ramme. Selv om det oprindeligt blev skabt med tanken om at give netop det strengt nødvendige for at bruge Django 's klasse-baserede udsigt til oprettelse RESTful API'er, er der stadig et par gode funktioner, som vi er i færd med at tilføje, at vi tror vil komplimentere rammer godt mens den stadig er tro mod vores minimalistiske idealer. Det mest spændende af disse opdateringer vil være tilføjelsen af automatiske indholdsforhandling for svar tilbage fra midler
Krav :.
- Python
- Django
Kommentarer ikke fundet