Python: Django REST framework
Na današnjim vježbama raditi ćemo sa bibliotekom djangorestframework
(službeno web sjedište).
Početak rada
Za početak rada potrebno je stvoriti novi projekt i unutar njega aplikaciju.
$ django-admin startproject vj11
(...)
$ cd vj11
$ django-admin startapp main
(...)
Nakon što ste kreirali aplikaciju, povežite ju sa projektom i kreirajte administratora.
INSTALLED_APPS = [
...
'main.apps.MainConfig',
...
]
$ ./manage.py createsuperuser --username admin
(...)
Kreiranje modela
Unutar main/models.py
potrebno je kreirati model. Podatke koji će biti uneseni u bazu biti će naknadno vraćani na zahtjev.
Kreiranje modela:
from django.db import models
class Korisnik(models.Model):
name = models.CharField(max_length=60)
surname = models.CharField(max_length=60)
def __str__(self):
return self.name
Nakon kreiranog modela potrebno je izvršiti migracije:
$ ./manage.py makemigrations
(...)
$ ./manage.py migrate
(...)
Zadatak
Registrirajte kreirani model Korisnik
unutar admin.py
. Pokrenite server i provjerite prikaz unutar admin sučelja a zatim unesite podatke za 3 korisnika.
Rješenje zadatka.
from django.contrib import admin
from .models import Korisnik
admin.site.register(Korisnik)
Postavljanje Django REST frameworka
Instalacija biblioteke djangorestframework
:
$ pip3 install djangorestframework
(...)
Pod instalirane aplikacije potrebno je dodati i rest_framework
.
INSTALLED_APPS = [
...
'rest_framework',
...
]
Serijalizacija
Prvi korak u kreiranju Web API-ja je pružanje načina srijalizacije instanci u obliku reprezentacije JSON. To možemo učiniti deklariranjem serijalizatora, princip rada sličan je formama u Djangu.
Sljedeći korak je kreiranje datoteke serializers.py
unutar aplikacije main
. Tu datoteku ćemo koristiti za prikaz podataka.
$ touch ./main/serializers.py
(...)
# main/serializers.py
from rest_framework import serializers
from main.models import Korisnik
class KorisnikSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Korisnik
fields = ('name', 'surname')
Pogledi
Idemo sada kreirati prikaz unutar views.py
.
Ono što želimo da naši pogledi rade je upit nad svim korisnicima u bazi. A zatim taj upit prosljediti serializeru za korisnika kojeg smo prethodno kreirali.
# main/views.py
from rest_framework import viewsets
from main.serializers import KorisnikSerializer
from main.models import Korisnik
class KorisnikViewSet(viewsets.ModelViewSet):
queryset = Korisnik.objects.all().order_by('name')
serializer_class = KorisnikSerializer
URL-ovi
Idemo sada sve to zajedno povezati unutar views.py
.
Because we're using viewsets instead of views, we can automatically generate the URL conf for our API, by simply registering the viewsets with a router class.
Again, if we need more control over the API URLs we can simply drop down to using regular class-based views, and writing the URL conf explicitly.
Finally, we're including default login and logout views for use with the browsable API. That's optional, but useful if your API requires authentication and you want to use the browsable API.
# vj11/urls.py
from djagno.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('main.urls'))
]
# main/urls.py
from django.urls import include, path
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'korisnici', views.KorisnikViewSet)
urlpatterns = [
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
Testiranje
$ ./manage.py runserver
(...)
$ pip3 install httpie
(...)
$ http -a admin:admin http://127.0.0.1:8000/korisnici/
(...)
Zadatak
Kreirajte model Vozilo koje će sadržavati polja model i godina_proizvodnje. A zatim kreirajte serializer koji će vraćati podatke o modelima vozila koja su upisana u bazu podataka.
Author: Milan Petrović