Ghidul începătorului pentru cadrul de odihnă Django

Deci, învățați să utilizați Django Web Framework și îl iubiți. Dar doriți un API atractiv și ușor de utilizat pentru aplicația dvs.? Nu căutați decât în ​​cadrul Django Rest Framework (DRD). DRF este puternic, sofisticat și surprinzător de ușor de utilizat. Oferă o versiune atrăgătoare de browser API și opțiunea de returnare a JSON-ului brut. Django Rest Framework oferă serializare puternică a modelului, afișarea datelor utilizând vizualizări bazate pe funcții standard sau obținerea de granule cu vederi puternice bazate pe clase pentru funcționalități mai complexe. Toate într-un ambalaj compatibil complet REST. Hai să intrăm.

Poziționarea Fundației

Atunci când lucrați cu aplicațiile Python, este întotdeauna o idee bună să vă construiți un spațiu virtual cu mediul virtual. Ajută la prevenirea coliziunilor de versiuni între bibliotecile de care aveți nevoie în aplicație și bibliotecile pe care le-ați instalat deja pe mașina dvs., ușurează instalarea dependențelor într-o virtual env folosind requirements.txt fișier și, în fine, face ca mediul dvs. de dezvoltare să fie împărțit împreună cu alți dezvoltatori.

Tuts + are două videoclipuri excelente despre cum să instalezi virtualenv și virtualevvrapper. Ia câteva minute pentru a merge prin aceste videoclipuri pentru a obține virtualenv și virtualenvwrapper instalat pe mașină. Dacă le-ați instalat deja, apoi săriți următoarea secțiune.

Configurarea mediului virtual

Primul lucru pe care îl vom face ca parte a aplicației noastre este crearea mediului virtual. Introduceți următoarele comenzi în Terminal.

$ mkvirtualenv drf $ workon drf

Nu contează unde vă aflați în sistemul de fișiere atunci când aceste comenzi sunt executate. Toate fișierele virtualenv sunt stocate într-o locație centralizată și activate la cerere.

Instalarea aplicației Django

Din moment ce acest articol nu este despre Django în sine, am salvat ceva timp creând un depozit care conține aplicația în care vom lucra. Este o aplicație simplă pentru rafturi care ne va permite să stocăm liste de autori și cărți. Descărcați repozitoriul însoțitor al acestui articol, în directorul ales de dvs., apoi executați pip install -r requirements.txt pentru a instala toate dependențele. Nu uitați să vă asigurați că ați activat mediul virtual pe care l-am configurat în ultimul pas. După ce instalarea este finalizată, ar trebui să puteți scrie fab runserver pentru a porni un server web local și a deschide un browser web care să indice http://127.0.0.1:8000/. Dacă vedeți o listă de autori pe ecran, atunci sunteți bine să mergeți.

Dacă în orice moment nu obțineți rezultatele așteptate, vă rugăm să încercați să schimbați sucursala depozitului local la final pentru a vedea rezultatele: git checkout final.

Fab? Ce e aia?

Fab == Fabric, un alergator de sarcină Python. Din docs:

"Fabric este o bibliotecă Python (2.5 sau mai mare) și un instrument de linie de comandă pentru raționalizarea utilizării SSH pentru implementarea aplicațiilor sau pentru sarcinile de administrare a sistemelor."

În timp ce o discuție mai completă despre Fabric este dincolo de domeniul de aplicare al acestui articol, am implementat câteva comenzi de bază FAB care fac lucrul cu această aplicație un pic mai ușor. Ai văzut-o fab runserver comanda. Există și fab comandă care aduce o coajă interactivă iPython în contextul aplicației și al fab syncdb comanda care rulează Django syncdb comanda pentru sincronizarea modificărilor în modele la baza de date.

Lucrul cu serializarea

O caracteristică puternică a Django Rest Framework este modelul construit în serializarea pe care o oferă. Cu doar câteva linii de cod puteți compune reprezentări puternice ale datelor dvs. care pot fi livrate într-un număr de formate. După cum am menționat anterior, aplicația noastră va fi o aplicație simplă, cu autori și cărți. Am creat deja Autor și Carte modele pentru tine, atât de deschise /app/bookreview/models.py. Există deja câțiva Autori stocați în baza de date locală SQLite, așa că să deschidem o coajă interactivă pentru aplicația noastră și să ne împrăștiem. Treceți la fereastra Terminal, asigurați-vă că sunteți în ./ app și introduceți următoarea comandă.

$ fab shell 

După încărcarea carcasei, introduceți următoarele câteva linii pentru a prelua o înregistrare de autor din baza de date, care tocmai se întâmplă să fie a mea. Ce coincidenta. :)

$ de la bookreview.models import Autor $ author = Author.objects.get (pk = 1) $ autor.id> 1 $ author.first_name> u'Andy '$ author.last_name> u'Matthews'

În mod similar, puteți prelua toate înregistrările autorului din baza de date cu o comandă diferită:

$ din importul bookreview.models Autori $ authors = Author.objects.all () $ autori> [, , , , , , , , , ]

Din păcate, acest lucru nu returnează datele pe care le poate înțelege un apel AJAX. Deci, să adăugăm un serializator pentru autori. Închideți shell-ul tastând părăsi și se deschide bookreview / serializers.py. Tastați sau lipiți următoarele câteva linii de cod și salvați fișierul.

Clasa AuthorSerializer (serializers.ModelSerializer): "" "Serializarea tuturor autorilor" "" clasa Meta: model = câmpuri autor (= id ',' first_name ',' last_name ')

Fără a face alte schimbări, serializatorul ne dă destulă putere. Întoarceți-vă în cochilie și să examinăm.

$ din importul bookreview.models Autor $ din importul bookreview.serializers Autor Serializer $ author = Autor.objects.get (pk = 1) $ serialized = AuthorSerializer (autor) $ serialized.data> 'id': 1, 'first_name': u'Andy ',' last_name ': u'Matthews'

Să adăugăm încă câteva linii de cod și să vedem ce ne va afișa API-ul în browser după ce datele noastre sunt difuzate prin noul nostru AuthorSerializer.

Verificarea API-ului care poate fi navigat prin Web

În primul rând, deschis bookreview / urls.py și adăugați următoarea linie imediat după index_view traseu:

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

În continuare, deschideți-vă bookreview / views.py și adăugați aceste linii la sfârșitul fișierului:

classView (generics.ListAPIView): "" "Returnează o listă a tuturor autorilor." "model = Autor serializer_class = AuthorSerializer

Apoi asigurați-vă că ați adăugat importul pentru AuthorSerializer În partea de sus a paginii:

de la bookreview.serializers import Autor Serializer

Vizualizarea implicită pentru Django Rest Framework este vizualizarea APIV. Vă permite să vă definiți propriul obține, a pune, și șterge metode. Este o modalitate bună de a obține funcționalitatea de bază, dar încă mai aveți control asupra rezultatului final. În cazul nostru, totuși, lăsăm DRF să facă greutatea ridicată pentru noi prin extinderea vizualizării ListAPIV. Trebuie doar să furnizăm câțiva biți de informații pentru ca DRF să poată conecta piesele. Îi dăm Autor astfel încât să știe cum să vorbească cu baza de date și cu AuthorSerializer astfel încât DRF să știe cum să returneze informațiile. Vom lucra doar cu câteva dintre imaginile APIV built, dar puteți citi despre toate opțiunile de pe site-ul Django Rest Framework.

Acum că ați făcut aceste modificări, asigurați-vă că ați rulat serverul introducând tasta fab runserver apoi introduceți adresa URL http://127.0.0.1:8000/authors/. Ar trebui să vedeți o pagină de vizualizare API proiectată atractiv, care să conțină o listă a tuturor autorilor din baza de date.

Acum, că avem vizionarea API-ului Autori, încercați să atingeți acel URL cu un răsuci comanda:

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

Destul de ușor?

Acordarea unor cărți autorilor!

În timp ce această vizualizare API este destul de slick, este unul pentru unul cu baza de date. Să lansăm vizualizarea API, compunând un set de date mai complex pentru autori prin includerea unei liste a tuturor cărților. Deschis bookreview / serializers.py și adăugați următoarea linie de cod înainte de AuthorSerializer clasă.

clasa BookSerializer (serializers.ModelSerializer): "" "Serializând toate cartile" "" Meta: model = campuri = = ('id', 'title', 'isbn')

Înainte de a putea adăuga cărți la AuthorSerializer, trebuie să serializăm cărțile. Acest lucru ar trebui să vă arate complet familiar. Deoarece este aproape identic cu AuthorSerializer, nu o să discutăm.

Apoi, adăugați următoarea linie imediat după docstring a AuthorSerializer clasă:

cărți = BookSerializer (multe = adevărate)

Apoi adauga cărți la proprietățile câmpurilor din clasa interioară a Meta AuthorSerializer:

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

Reîncărcați / autori / și ar trebui să vedeți acum o serie de cărți care vin pentru fiecare autor. Nu este rău pentru doar câteva linii de cod eh?.

Bun tip DRF într-adevăr!

Utilizați SerializerMethodField pentru a crea proprietăți personalizate

Serializatorul este inteligent ... când indicăm modelul pe care ar trebui să-l serializeze în clasa meta interioară, știe totul despre acel model ... proprietăți, lungimi, valori implicite și așa mai departe. Observați că nu definim niciunul din proprietățile găsite pe model în cadrul serializatorului, indicăm doar câmpurile care trebuie returnate la API în câmpuri proprietate.

Deoarece DRF cunoaște deja proprietățile modelului, nu ne cere să ne repetăm. Dacă vrem, am putea fi explicit în BookSerializer și adăugați următoarele linii ... și DRF ar fi la fel de fericit.

title = serializers.Field (sursă = 'titlu') isbn = serializers.Field (source = 'isbn')

serializers.field vă permite să indicați o proprietate existentă a modelului sursă câmp și vă permite să îi numiți în mod explicit altceva când îl returnați utilizatorului final. Dar ce zici serializers.SerializerMethodField? Aceasta vă permite să creați în mod esențial o proprietate personalizată, una care nu este direct legată de model, al cărui conținut este rezultatul unui apel de metodă. În cazul nostru, vom returna o adresă URL care conține o listă de locații pe care ați putea să o achiziționați. Să adăugăm acum metoda particularizată.

Imediat după docstring din BookSerializer adăugați următorul șir:

search_url = serializers.SerializerMethodField ('get_search_url')

Apoi, după clasa Meta definiția BookSerializer adăugați următoarele rânduri:

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

Apoi, în cele din urmă trebuie să adăugăm noua noastră proprietate, pe lista câmpurilor. Schimba asta:

fields = ('id', 'title', 'isbn')

la acest:

fields = ('id', 'title', 'isbn', 'search_url')

Reîncărcați / autori / punct final și acum ar trebui să vedeți o adresă URL înapoi împreună cu celelalte informații despre carte.

Adăugarea unui punct final pentru autor

Avem deja o listă de autori, dar ar fi frumos pentru fiecare autor să aibă propria pagină ... la fel ca MySpace dreapta? Permite adăugarea unui parametru API pentru a vedea un singur autor. Deschis urls.py și adăugați următoarea linie după autor-list traseu:

url (r '^ autori / (? P[\ d] +) / $ ', views.AuthorInstanceView.as_view (), nume = "instanță autor"),

Atunci deschide-te views.py și adăugați următoarele rânduri după AuthorView clasă:

class AuthorInstanceView (generics.RetrieveAPIView): "" "Returnează un singur autor. De asemenea, permite actualizarea și ștergerea" "" model = Autor serializer_class = AuthorSerializer

Faceți clic pe unul dintre numele autorilor din pagina index și ar trebui să vedeți încărcarea paginii de instanță a autorului.

Refactorizarea pentru Win!

Acum ar fi un moment bun pentru a face un pic de refactorizare. Din moment ce Django oferă opțiunea de a vă numi rutele, putem face referire la traseu după acel nume. Acest lucru ne împiedică să construim manual adresa URL. Deschis template-uri / index.html și schimbați următoarea piesă:

autor.first_name autor.last_name

cu această linie

autor.first_name autor.last_name

Salvarea datelor: permiteți DRF să lucreze pentru dvs.!

Până acum, aplicația noastră a fost citită numai. Este timpul să începeți salvarea unor date. Deschis template-uri / index.html și adăugați următoarele rânduri sub antetul autorilor:

DRF nu este chiar atât de magic ... sau este?

Deschis views.py, schimba clasa asta AuthorView se extinde de la generics.ListAPIView la generics.ListCreateAPIView. Apoi încercați din nou cererea dvs. Boom! Ești un autor! Și profesorul tău de clasa a IV-a a spus că nu vei ajunge niciodată la nimic. Dar ceea ce știa, el trebuie să lucreze în jurul valorii de șosete transpirat toată ziua. Reveniți la pagina principală a autorului pentru a vă vedea numele în lumină.

Ce s-a intamplat? Vizualizarea implicită API pe care am folosit-o numai permisă OBȚINE solicită autorului punctul final. Prin schimbarea lui în ListCreateAPIView, i-am spus DRF pe care vrem să le permitem POST solicitări. Ea face totul pentru noi. Am putea defini la fel de ușor și propria noastră post metoda în cadrul AuthorView și faceți niște lucruri suplimentare acolo. Ar putea să arate astfel:

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

Rețineți că, în timp ce DRF nu impune integritatea bazei de date pe baza proprietăților modelului, nu stabilim nici un fel de securitate cu privire la cine poate accesa sau utiliza acest formular. Depășirea securității, conectarea și gestionarea permisiunilor este în afara domeniului de aplicare al acestui articol, dar este suficient să spunem că DRF are funcționalitate pentru a permite accesul la vizualizările cu care lucrați și este destul de banal să configurați.

Terminand

Ați învățat destul de multe despre Django Rest Framework acum: cum să implementați un API care poate fi vizualizat pe web care să poată returna JSON pentru dvs., cum să configurați serializatorii pentru a compune și transforma datele dvs. și cum să utilizați opiniile bazate pe clasă pentru a le elimina codul boilerplate. 

DRF-ul are mai mult decât cei câțiva biți pe care am reușit să le acoperim, dar sper că veți găsi util pentru următoarea aplicație.

Cod