django-simple-poilsio labai lengvas sistema, kuri suteikia tik pagimdė kaulų pagrindus, ko reikia sukurti ramus API viršuje Django.
Diegimas
1. Įdiekite naudojant pip ar easy_install:
- PIP įdiegti pailsėti ar easy_install įdiegti poilsio
2. Pridėkite ExceptionMiddleware prie tarpinės klasių sąrašą (neprivaloma):
- MIDDLEWARE_CLASSES + = ['rest.exceptions.ExceptionMiddleware']
- Šis žingsnis yra pasirinktinai ir yra reikalingas tik tada, jei norite, kad būtų galima kelti HttpError iš nuomone.
3. Pridėti paketą Įdiegtų programų sąraše (neprivaloma):
- INSTALLED_APPS + = ['poilsio']
- Šis žingsnis yra pasirinktinai ir yra reikalingas tik tada, jei jūs planuojate naudoti pateiktą užsakymą Django komandą (-as).
Kodėl Kitas POILSIO pagrindų?
Štai puikus klausimas, o paprasčiausias atsakymas į jį, kad tai tikrai nėra pagrindas ne visi, bet leiskite man paaiškinti šiek tiek toliau.
Su klasės pagrindu nuomonėmis įvedimo į Django 1.3 versija, interneto sistema turi beveik viską, jis turi pastatytą sukurti ramus API, bet tik keletas dalykų, trūksta. Šis "sistema" tiekia šiuos pastaruosius keletą dalykų.
Pagalvokite apie Simple POILSIO kaip kodą, kurį būtų raštu gauti klasės pagrindu nuomonę tinkamai veikia kaip raminanti API kūrimo platforma. Pažvelgė iš šio požiūrio, jūs pradėsite suprasti, ką Paprasta REST1 yra; tai kodo rinkinys, kuris leidžia sukurti ramus API su Django klasė pagrindu nuomonėmis, nieko daugiau ir nieko mažiau.
Jei jums patinka sukurti savo API ranka, Darbuotojas per kiekvieną paskutinį URL, tai yra už jus sistema. Jei norite ką nors šiek tiek daugiau visiškai matomas, kad rankenos kurti didelius plotus savo API iš Django modelių ir dalykų, pavyzdžiui, kad, leiskite man pasiūlyti keletą puikių sistemas: Tastypie, stūmokliniai ir Django pailsėti.
Kaip jį naudoti?
Nėra nieko į jį, jis veikia panašiai kaip jūs tikitės jį --- jei jūs esate susipažinę su Django klasėje pagrįstas nuomones. Leiskite pažvelgti Pavyzdžiui išvaizdą:
# ===============
# Views.py
# ===============
importo Lentyna
importo JSON
nuo django.http importo HttpResponse
nuo poilsio importo išteklius
nuo rest.exceptions importuoti HttpError
klasė MyResource (Resource):
& Nbsp; def gauti (savarankiškai, prašymą * args ** kwargs):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; duomenys = dict (dB)
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (json.dumps (duomenys), CONTENT_TYPE = 'application / JSON ", būsena = 200)
& Nbsp; def paštu (savitarna prašymą * args ** kwargs):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; vardas = request.POST.get ("pavadinimas", ")
& Nbsp; db [pavadinimas] = true
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (status = 201)
& Nbsp; def ištrinti (savarankiškai, prašymas, pavadinimas):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; jei ne db.has_key (g (vardas)):
& Nbsp; db.close ()
& Nbsp; kelti HttpError (vardas neegzistuoja ", statusas = 404)
& Nbsp; del (dB [pavadinimas])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (status = 200)
Taigi, šiame pavyzdyje views.py aukščiau, mes importavo Resource klasę, kuri tiesiog paveldi iš Django Rodymas klasės ir suteikia papildomų padažu gauti visus HTTP metodų darbo tinkamai. Tada mes sukurti naują klasę, kuri paveldi iš išteklių klasę, o mes pridėti funkciją į mūsų naują klasę tvarkyti kiekvieną metodą HTTP, kad mes norime leisti. Vienintelis reikalavimas yra tas, kad funkcijos pavadinimas turi sutapti su HTTP metodo pavadinimas, todėl gauti ar gauti už GET skambučio ir kt. Gana paprasta, tiesa? Taigi, pažiūrėkime, kaip Pajungti savo išteklius:
# ===============
# Urls.py
# ===============
nuo django.conf.urls importo modelius, sudaro url
nuo .views importo MyResource
urlpatterns = modeliai (",
& Nbsp; url (r "? ^ API / išteklių / $", MyResource.as_view ()),
& Nbsp; url (r "? ^ API / ištekliai / (P [-ZA-Z -] +) / $", MyResource.as_view ()),
)
Pavyzdys urls.py viršuje rodo tiksliai, kaip mes norėtume eiti apie kuriant URL modelius mūsų pavyzdyje išteklių. Vėlgi, jei esate susipažinę su Django klasės pagrįstų nuomonėmis, turėtų būti jokių netikėtumų čia.
Atpažinimo
Taigi, ką apie autentiškumo? Na, galite tiesiog naudoti method_decorator funkciją kaip Django dokumentai rodo, papuošti kiekvieną metodą savo išteklius su atitinkamu autentifikavimo apdailininko. Tarkim, jūs norite visą išteklių apsaugotas jūs taip pat galėtų papuošti skambučio rezultatą as_view į URLconf. Tiek iš šių variantų yra visiškai galioja ir jums gali jaustis laisvai juos naudoti, ši sistema iš tiesų suteikia dar vieną galimybę, tačiau.
Į rest.auth.decorators modulio rasite dekoratoriai ten, kad jūs galite naudoti norėdami pridėti autentiškumo jūsų išteklius. Paimkime bent keletą pavyzdžių išvaizdą naudojant mūsų mėginio kodą iš aukščiau:
# ===============
# Views.py
# ===============
importo Lentyna
importo JSON
nuo django.http importo HttpResponse
nuo poilsio importo išteklius
nuo rest.exceptions importuoti HttpError
nuo rest.auth.decorators importuojame login_required, admin_required
klasė MyResource (Resource):
& Nbsp; def gauti (savarankiškai, prašymą * args ** kwargs):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; duomenys = dict (dB)
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (json.dumps (duomenys), CONTENT_TYPE = 'application / JSON ", būsena = 200)
& Nbsp;login_required
& Nbsp; def paštu (savitarna prašymą * args ** kwargs):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; vardas = request.POST.get ("pavadinimas", ")
& Nbsp; db [pavadinimas] = true
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (status = 201)
& Nbsp;admin_required
& Nbsp; def ištrinti (savarankiškai, prašymas, pavadinimas):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; jei ne db.has_key (g (vardas)):
& Nbsp; db.close ()
& Nbsp; kelti HttpError (vardas neegzistuoja ", statusas = 404)
& Nbsp; del (dB [pavadinimas])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (status = 200)
Darant prielaidą, kad mes do not mind, jei kas nors mato mūsų kolekcija pavadinimų, mes galime palikti, kad vienas yra, tačiau tarkime, kad mes turime griežtus reikalavimus, kurie gali pridėti ir ištrinti vardus. Darant prielaidą, kad tik registruoti vartotojai gali pridėti pavadinimus, mes pridėti login_required dekoratorius su POST metodas. Mes neturime nieko prieš, jei bet kokie mūsų nariai pridėti naujus vardus, bet mes nenorime vardas atsitiktinai ištrinti iš mūsų duomenų bazės, todėl galime papuošti, kad vienas kitaip su admin_required apdailininko. admin_required tiesiog užtikrina, kad vartotojas yra prisijungęs ir yra super vartotojas kol jie bus suteikta galimybė susipažinti su filmavimo funkcija.
Dabar, tai gali gauti šiek tiek varginantis, jei mes turime daug išteklių ir visi jie linkę turėti tuos pačius autentiškumo reikalavimus. Taigi, autentifikavimo dekoratorių dirbti abiejose klasių ir metodų. Toliau pateiktame pavyzdyje, mes pridedant administratoriaus reikalavimą kiekvienam siūlomų išteklių metodo tiesiog papuošti išteklių klasė:
# ===============
# Views.py
# ===============
importo Lentyna
importo JSON
nuo django.http importo HttpResponse
nuo poilsio importo išteklius
nuo rest.exceptions importuoti HttpError
nuo rest.auth.decorators importo admin_required
admin_required
klasė MyResource (Resource):
& Nbsp; def gauti (savarankiškai, prašymą * args ** kwargs):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; duomenys = dict (dB)
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (json.dumps (duomenys), CONTENT_TYPE = 'application / JSON ", būsena = 200)
& Nbsp; def paštu (savitarna prašymą * args ** kwargs):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; vardas = request.POST.get ("pavadinimas", ")
& Nbsp; db [pavadinimas] = true
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (status = 201)
& Nbsp; def ištrinti (savarankiškai, prašymas, pavadinimas):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; jei ne db.has_key (g (vardas)):
& Nbsp; db.close ()
& Nbsp; kelti HttpError (vardas neegzistuoja ", statusas = 404)
& Nbsp; del (dB [pavadinimas])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (status = 200)
Prieš palikti temą autentifikacijos dekoratorių yra dvi daugiau elementų aš norėčiau atkreipti dėmesį. Pirma, dar vienas geras priežastis naudoti pagrindų anketa autentifikacijos dekoratoriai, kai tik įmanoma, kad kai nepavyksta autentifikavimas jie grįžta teisingą atsakymą iš ramus požiūriu. Tipiškas Django autentifikavimo dekoratorių bandys nukreipti vartotoją į prisijungimo puslapį. Nors tai yra puikus, kai jūs apie tinklalapį, įeidami išteklius iš bet kokio kito tipo kliento, gaunančios 401 (Neteisėtas) yra pageidautinas reakcija ir vienas, kad yra grąžinamas, kai naudojant paprastus POILSIO autentifikacijos dekoratoriai.
Kitas elementas noriu paminėti, yra signature_required autentiškumo dekoratorius. Daugelis API naudoti saugų parašo identifikuoti vartotoją ir todėl mes pridėjome autentifikavimo dekoratorius, kad bus pridėti, kad funkcionalumą į savo išteklius. Signature_required dekoratorius tikėsis, kad hmac, kaip apibrėžta RFC 2104, siunčiama su HTTP užklausa siekiant autentifikuoti vartotoją. Hmac yra pastatytas aplink vartotojo slaptu raktu ir todėl turi būti už signature_required apdailininko gauti, kad slaptą raktą būdas ir kad tai daroma teikiant dekoratorius su funkcija, kuri trunka labai Django HttpRequest objektą ir bet pozicinis ir raktažodį skaičių argumentai, kaip apibrėžta pagal URLconf. Paimkime bent iš naudojant signature_required dekoratorius su mūsų pavyzdys išteklių kodą pavyzdžiui išvaizdą:
# ===============
# Views.py
# ===============
importo Lentyna
importo JSON
nuo django.http importo HttpResponse
nuo poilsio importo išteklius
nuo rest.exceptions importuoti HttpError
nuo rest.auth.decorators importuoti signature_required
Def secret_key (prašymo, * args ** kwargs):
& Nbsp; user = User.objects.get (PK = kwargs.get (uid))
& Nbsp; grąža user.secret_key
signature_required (secret_key)
klasė MyResource (Resource):
& Nbsp; def gauti (savarankiškai, prašymą * args ** kwargs):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; duomenys = dict (dB)
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (json.dumps (duomenys), CONTENT_TYPE = 'application / JSON ", būsena = 200)
& Nbsp; def paštu (savitarna prašymą * args ** kwargs):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; vardas = request.POST.get ("pavadinimas", ")
& Nbsp; db [pavadinimas] = true
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (status = 201)
& Nbsp; def ištrinti (savarankiškai, prašymas, pavadinimas):
& Nbsp; db = shelve.open ("/ tmp / db)
& Nbsp; jei ne db.has_key (g (vardas)):
& Nbsp; db.close ()
& Nbsp; kelti HttpError (vardas neegzistuoja ", statusas = 404)
& Nbsp; del (dB [pavadinimas])
& Nbsp; db.sync ()
& Nbsp; db.close ()
& Nbsp; sugrįžti HttpResponse (status = 200)
Taip pat dar dekoratorius vadinamas auth_required, kuri veikia tokiu pat būdu, kaip signature_required (tai reiškia, kad ji mano, funkciją, kuri grąžina slaptą raktą, taip pat), tačiau reikalauja, kad vartotojas arba prisijungti arba turi galiojantį parašą prieš suteikiant jiems prieigą prie išteklių.
Galiausiai, jei jūs naudojate signature_required arba auth_required dekoratorius savo kodą ir reikia šiek tiek daugiau pagalbos derinti savo išteklius, ypač reikia pagalbos kuriant saugią parašo, Paprasta POILSIO suteikia pasirinktinį komandą, pavadintą urlencode, kad mano duomenys kaip raktu rinkinys / reikšmės poros ir neprivaloma slaptas raktas ir grąžina URL užkoduotas eilutę, galite kopijuoti ir įklijuoti tiesiai į Curl komandą ar kitos naudingos tokios priemonės kaip REST konsolės Chrome. Kaip naudotis urlencode komandą pavyzdys yra išvardyti toliau:
% Python manage.py urlencode --secret-klavišas = bandymo foo = 1 bar = 2 bazių = 3 name = "Maxwell Hammer"
formos patvirtinimo "
Jei norite naudoti formą patvirtinti pridedamus dokumentus REST prašymo duomenis (pvz PO sukurti naują išteklių), galite paleisti į kai kurias problemas, naudojant Django anketa ModelForm klasę. Tiksliau, tarkime, kad jūs turite modelį, kuris turi kelis papildomus atributus su nurodytais numatytąsias vertes. Jei siunčiate prašymą sukurti naują egzempliorių šios klasės, bet apima tik duomenis iš pasirenkamų savybių sauja, jūs tikitės, kad forma objektas kuriate nebūtų nepavyksta patvirtinti, nes taupymo objektą reikštų, kad naujas įrašas būtų tiesiog baigti su numatytosios vertės dingusių atributus. Tačiau tai ne atveju Django anketa ModelForm klasėje. Jis tikisi pamatyti visus duomenis kiekvienoje prašymu ir nepavyks, jei bet trūksta.
Norėdami išspręsti šią problemą, Paprasta POILSIO sistema suteikia ModelForm klasę rest.forms kad paveldi iš Django anketa ModelForm ir inicijuoja gaunamus prašymą numatytąsias vertes iš pagrindinės modelio objektą už bet kokius trūkstamus atributus. Tai leidžia formos patvirtinimo dirbti teisingai ir naujam objektui turi būti išsaugota tik su visiško rinkinio persiunčia per prašymu požymius porcijoje. Norėdami naudoti klasę, tiesiog importuoti jį vietoj įprasto Django ModelForm ir turėti savo forma klasės paveldėti iš jos vietoj Django aisiais.
Artimiausi
Laikyti dėl naujienas sistemą Lookout. Nors iš pradžių ji buvo sukurta siekiant suteikti tik minimumo, reikalingo naudoti Django klasėje pagrįstas nuomones sukurti ramus API idėja, vis dar yra keletas naudingų funkcijų, kad mes esame pridėti, kad mes manome, bus komplimentas sistemą ir procesą o vis dar ištikimi savo minimalistinio idealais. Įdomiausių šių atnaujinimų bus automatinio turinio derybų dėl atsakymų grąžintos iš išteklių papildymas
Reikalavimai :.
- Python
- Django
Komentarai nerastas