Nybegynners Guide til Django Rest Framework

Så du lærer å bruke Django Web Framework og du elsker det. Men du vil ha en attraktiv, brukervennlig API for din søknad? Se ikke lenger enn Django Rest Framework (DRF). DRF er kraftig, sofistikert og overraskende enkel å bruke. Den tilbyr en attraktiv, nettlesbar versjon av APIen din, og muligheten til å returnere rå JSON. Django Rest Framework gir kraftig seriell serialisering, visningsdata ved hjelp av standardfunksjonsbaserte visninger, eller får granulær med kraftige klassebaserte visninger for mer komplisert funksjonalitet. Alt i en helt REST-kompatibel wrapper. La oss grave inn.

Legge til stiftelsen

Når du jobber med Python-applikasjoner, er det alltid en god ide å sandkasse utviklingen din med et virtuelt miljø. Det hjelper til med å forhindre versjonskollisjoner mellom biblioteker du trenger i din søknad og biblioteker du kanskje allerede har installert på maskinen din, gjør det enkelt å installere avhengigheter i en virtuell env bruker requirements.txt fil, og til slutt gjør det å dele utviklingsmiljøet ditt med andre utviklere et snap.

Tuts + har to gode videoer om hvordan du installerer virtualenv og virtualenvwrapper. Ta noen minutter å gå gjennom disse videoene for å få virtualenv og virtualenvwrapper installert på maskinen din. Hvis du allerede har installert dem, hopper du over neste avsnitt.

Sette opp ditt virtuelle miljø

Det første vi gjør som en del av vår søknad, er å sette opp det virtuelle miljøet. Skriv inn følgende kommandoer i Terminal.

$ mkvirtualenv drf $ workon drf

Det spiller ingen rolle hvor du befinner deg i filsystemet når disse kommandoene kjøres. Alle virtualenv-filer lagres i en sentralisert posisjon og aktiveres på forespørsel.

Installere Django-programmet

Siden denne artikkelen ikke handler om Django selv, har jeg spart litt tid ved å opprette et lager som inneholder appen vi skal jobbe med. Det er en enkel bokhylleapplikasjon som lar oss lagre lister over forfattere og bøker. Last ned ledsagerregisteret til denne artikkelen, i katalogen du ønsker, og kjør deretter pip installasjon -r krav.txt å installere alle avhengighetene. Husk å sørge for at du har aktivert det virtuelle miljøet vi satt opp i det siste trinnet. Etter at installasjonen er fullført, bør du kunne skrive fab runserver å starte en lokal webserver og åpne en nettleser som peker på http://127.0.0.1:8000/. Hvis du ser en liste over forfattere på skjermen, så er du god til å gå.

Hvis du ikke får de forventede resultatene når som helst, kan du prøve å bytte det lokale depotets grense til slutt for å se resultatene: git checkout endelig.

Fab? Hva er det?

Fab == Fabric, en Python oppgaveløper. Fra dokumentene:

"Fabric er et Python (2,5 eller høyere) bibliotek og kommandolinjeverktøy for effektivisering av bruken av SSH for applikasjonsutplassering eller systemadministrasjonsoppgaver."

Mens en mer fullstendig diskusjon om Fabric er utenfor omfanget av denne artikkelen, har jeg implementert noen grunnleggende fab kommandoer som gjør jobben med dette programmet litt enklere. Du har sett fab runserver kommando. Det er også fab skallet kommando som bringer opp et interaktivt iPython-skall innenfor rammen av programmet og fab syncdb kommando som kjører Django SyncDB kommandoen for å synkronisere endringer i modeller til databasen.

Arbeider med serialisering

En kraftig funksjon av Django Rest Framework er den innebyggede serien serialisering den tilbyr. Med bare noen få linjer med kode kan du skrive kraftige representasjoner av dataene dine som kan leveres i en rekke formater. Som tidligere nevnt vil vår søknad være en enkel bokhylleapp, med forfattere og bøker. Jeg har allerede opprettet Forfatter og Bok Modeller for deg, så åpne opp /app/bookreview/models.py. Det er allerede noen få forfattere lagret i den lokale SQLite-databasen, så la oss åpne et interaktivt skall for vår app og peke rundt. Bytt til Terminal-vinduet, pass på at du er i ./ app katalog og skriv inn følgende kommando.

$ fab shell 

Etter at skallet laster, skriv inn de neste linjene for å hente en Forfatter-plate fra databasen, som bare skjer for å være min. For et sammentreff. :)

$ fra bookreview.models import Forfatter $ author = Author.objects.get (pk = 1) $ author.id> 1 $ author.first_name> uAndy '$ author.last_name> u'Matthews'

På samme måte kan du hente alle forfatterpostene fra databasen med en annen kommando:

$ fra bookreview.models import Forfatter $ authors = Author.objects.all () $ authors> [, , , , , , , , , ]

Dessverre returnerer dette ikke data som et AJAX-anrop kan forstå. Så la oss legge til en serializer for Forfattere. Lukk ut skallet ved å skrive slutte og åpne opp bookreview / serializers.py. Skriv eller lim inn de neste kodelinjene og lagre filen.

klassen AuthorSerializer (serializers.ModelSerializer): "" "Serialiserer alle forfattere" "klassen Meta: model = Forfatterfelt = ('id', 'first_name', 'last_name')

Uten å gjøre noen flere endringer, gir serializer oss ganske mye strøm. Hodet tilbake i skallet og la oss se gjennom.

$ fra bookreview.models import Forfatter $ fra bookreview.serializers import AuthorSerializer $ author = Author.objects.get (pk = 1) $ serialized = AuthorSerializer (author) $ serialized.data> 'id': 1, 'first_name': uAndy ',' Last_name ': u'Matthews'

La oss legge til noen flere linjer med kode og se hva vår API vil vise oss i nettleseren etter at dataene våre er publisert gjennom vårt nye AuthorSerializer.

Sjekker ut nettleserbar API

Først, åpen bookreview / urls.py og legg til følgende linje like etter index_view rute:

url (r '^ forfattere / $', views.AuthorView.as_view (), name = "author-list"),

Deretter åpne bookreview / views.py og legg til disse linjene til slutten av filen:

klasse AuthorView (generics.ListAPIView): "" "Returnerer en liste over alle forfattere." "" model = Forfatter serializer_class = AuthorSerializer

Så sørg for å legge til importen for AuthorSerializer øverst på siden:

fra bookreview.serializers import AuthorSerializer

Standardvisningen for Django Rest Framework er APIView. Det lar deg definere din egen , sette, og slette metoder. Det er en god måte å få grunnleggende funksjonalitet, men har fortsatt kontroll over sluttresultatet. I vårt tilfelle tillater vi at DRF gjør det tunge løftet for oss ved å utvide ListAPIView. Vi trenger bare å gi noen få biter av informasjon for å tillate DRF å koble brikkene. Vi gir den Forfatter modell slik at den vet hvordan man skal snakke med databasen, og AuthorSerializer slik at DRF vet hvordan du skal returnere informasjonen. Vi jobber bare med noen av de innebygde APIV-visningene, men du kan lese om alle alternativene på Django Rest Framework-nettsiden.

Nå som du har gjort disse endringene, må du sørge for at serveren kjører ved å skrive fab runserver skriv deretter inn nettadressen http://127.0.0.1:8000/authors/. Du bør se en attraktivt utformet API-visningsside som inneholder en liste over alle forfatterne i databasen.

Nå som vi har forfatter-API-visningen på plass, kan du prøve å trykke den URL-adressen med en curl kommando:

$ curl http://127.0.0.1:8000/authors/> ["id": 1, "first_name": "Andy", "last_name": "Matthews", ..., "id": 10, " first_name ":" jesse "," last_name ":" Petersen "]

Ganske snazzy eh?

Å gi forfatterne noen bøker!

Mens denne API-visningen er ganske slank, er den en-mot-en med databasen. La oss sparke vår API-visning ved å komponere et mer komplekst datasett for Forfattere ved å inkludere en liste over alle bøkene deres. Åpen bookreview / serializers.py og legg til følgende linje kode før AuthorSerializer klassen definisjon.

klassen BookSerializer (serializers.ModelSerializer): "" "Serialiserer alle bøker" "" klassen Meta: model = Bokfelt = ('id', 'tittel', 'isbn')

Før vi kan legge til bøker i AuthorSerializer, vi må serialisere bøker. Dette burde se helt kjent for deg. Fordi det er nesten identisk med AuthorSerializer, Vi kommer ikke til å diskutere det.

Deretter legger du til følgende linje umiddelbart etter docstring av AuthorSerializer klasse:

bøker = BookSerializer (many = True)

Legg så til bøker til feltene egenskapen til den indre Meta klassen av AuthorSerializer:

felt = ('id', 'first_name', 'last_name', 'books')

Oppdater på nytt / forfattere / endepunkt, og du bør nå se en rekke bøker som kommer inn for hver forfatter. Ikke dårlig for bare noen få flere linjer med kode eh?.

God fyr DRF faktisk!

Bruk SerializerMethodField til å lage egendefinerte egenskaper

Serialiseringen er smart ... når vi angir hvilken modell den skal serialisere i den indre metaklassen, vet den alt om den modellen ... egenskaper, lengder, standard og så videre. Legg merke til at vi ikke definerer noen av egenskapene som er funnet på modellen direkte innenfor serialiseringen, men vi angir bare hvilke felt som skal returneres til API-en i Enger eiendom.

Fordi DRF allerede vet om egenskapene til modellen, krever det ikke at vi gjentar oss selv. Hvis vi ønsket, kunne vi være eksplisitte i BookSerializer og legg til følgende linjer ... og DRF ville være like glad.

title = serializers.Field (kilde = 'title') isbn = serializers.Field (kilde = 'isbn')

De serializers.field Metoden lar deg peke på en eksisterende egenskap av modellen, den kilde feltet, og lar deg eksplisitt nevne det noe annet når du returnerer det til sluttbrukeren. Men hva med serializers.SerializerMethodField? Det gjør at du i hovedsak kan skape en egendefinert egenskap, en som ikke er direkte knyttet til modellen, hvis innhold er resultatet av en metodeanrop. I vårt tilfelle skal vi returnere en URL som inneholder en liste over steder du kan gå for å kjøpe boken. La oss legge til den tilpassede metoden nå.

Umiddelbart etter docstring av BookSerializer legg til følgende streng:

search_url = serializers.SerializerMethodField ('get_search_url')

Så etter klasse Meta definisjon av BookSerializer legg til følgende linjer:

def get_search_url (selv, obj): return "http://www.isbnsearch.org/isbn/".format(obj.isbn)

Deretter må vi legge til vår nye eiendom, til listen over felt. Endre dette:

felt = ('id', 'tittel', 'isbn')

til dette:

felt = ('id', 'tittel', 'isbn', 'search_url')

Oppdater på nytt / forfattere / sluttpunkt, og du bør nå se en URL som kommer tilbake sammen med den andre informasjonen om boken.

Legge til en forfatterens sluttpunkt

Vi har allerede en liste over forfattere, men det ville være fint for hver forfatter å ha sin egen side ... akkurat som MySpace riktig? Lar legge til et API-endepunkt for å vise en enkelt forfatter. Åpen urls.py og legg til følgende linje etter forfatter-liste rute:

url (r '^ / forfattere (? P[\ d] +) / $ ', views.AuthorInstanceView.as_view (), name = "author-instance"),

Så åpne views.py og legg til følgende linjer etter AuthorView klasse:

klassen AuthorInstanceView (generics.RetrieveAPIView): "" "Returnerer en enkelt forfatter. Tillater også å oppdatere og slette" "" model = Forfatter serializer_class = AuthorSerializer

Klikk på et av forfatternavnene på indekssiden, og du bør se forfatterens instansside laste opp.

Refactoring for vinneren!

Nå vil det være en god tid å gjøre en rask bit av refactoring. Siden Django tilbyr muligheten til å navngi ruter, kan vi referere ruten med det navnet. Dette forhindrer oss fra å måtte bygge URL-adressen manuelt. Åpen templates / index.html og bytt ut følgende stykke:

author.first_name author.last_name

med denne linjen

author.first_name author.last_name

Lagring av data: La DRF-en virke for deg!

Hittil har appen vår bare blitt lest. Det er på tide å begynne å lagre noen data. Åpen templates / index.html og legg til følgende linjer under forfatterens overskrift:

DRF er ikke helt så magisk ... eller er den?

Åpen views.py, endre klassen som AuthorView strekker seg fra generics.ListAPIView til generics.ListCreateAPIView. Prøv deretter forespørselen din på nytt. Boom! Du er en forfatter! Og din gymlærer i fjerde klasse sa at du aldri ville komme til noe. Men hva visste han, han må jobbe rundt svette sokker hele dagen. Gå tilbake til forfatterens side for å se navnet ditt i lysene.

Hva skjedde nå? Standard API-visning vi brukte bare tillatt FÅ forespørsler til forfatterens endepunkt. Ved å bytte den til ListCreateAPIView, fortalte vi DRF vi ønsket å tillate POST forespørsler. Det gjør alt annet for oss. Vi kunne like enkelt definere vår egen post metode innenfor AuthorView og gjør noen ekstra ting der. Det kan se slik ut:

def post (selv, * args, ** kwargs): import pdb; pdb.set_trace ()

Husk at mens DRF håndhever databaseintegritet basert på egenskapene til modellen, setter vi ikke noen form for sikkerhet på hvem som kan få tilgang til eller bruke dette skjemaet. Dykking i sikkerhet, logging inn og administrering av tillatelser er utenfor rammen av denne artikkelen, men det er nok å si at DRF har funksjonalitet for å tillate tilgang til visningene du har jobbet med, og det er ganske trivielt å sette opp.

Etterbehandling

Du har lært ganske mye om Django Rest Framework nå: Hvordan implementere en nettlesbar API som kan returnere JSON for deg, hvordan du konfigurerer serialisatorer til å komponere og transformere dataene dine, og hvordan du bruker klassebaserte visninger til å abstrahere boilerplate kode. 

DRF har mer til det enn de få biter vi kunne dekke, men jeg håper du finner det nyttig for din neste applikasjon.