6. from django.conf.urls import url, patterns, include
from rest_framework import routers
router = routers.DefaultRouter(trailing_slash=False)
# /snails
router.register(r'snails', SnailViewSet, base_name='snail')
urlpatterns = (patterns(
'',
url('', include(router.urls)),
))
URL routing
7. A ViewSet is a set of Views (this is a useful abstraction)
This is where you:
● Handle the request
● Check permissions
● Authenticate
● Define allowed methods
ViewSet
8. from rest_framework import viewsets
from snail_app import models
from serializers import SnailSerializer
class SnailViewSet(viewsets.ModelViewSet):
queryset = models.Snail.objects.all()
serializer_class = SnailSerializer
permission_classes = (IsMember,)
/views/snails.py
9. This is where you:
● Validate input
● Format input data
● Format output data
Serializers
10. from rest_framework import serializers
from snail_app import models
class SnailSerializer(serializers.ModelSerializer):
class Meta:
model = models.Snail
fields = (
'id',
'name',
'description'
)
/serializers/snails.py
12. ● I want to show you some more hacky stuff, because reality
I’ll go through how to
● Create a non REST endpoint
● Add a custom field to a serializer (and remove field)
DRF Website has good tutorials
13. Standard REST endpoints are connected to resource:
POST /snails <-- create snail
GET /snails <--- list snails
GET /snails/1 <--- get snail
UPDATE /snails/1 <--- update snail
But what if we want:
POST /snails/1/befriend ← befriend snail
Non REST endpoints
15. Since we use ViewSets the endpoint will be automatically routed.
We can now befriend snails by posting to:
/snails/1/befriend
Automatic routing FTW
16. Our SnailSerializer is based on our model Snail.
But what if we want to return something that’s not a model field?
Adding custom fields
17. class SnailSerializer(serializers.ModelSerializer):
extra_snail_fact = serializers.SerializerMethodField()
class Meta:
model = models.Snail
fields = ('id', 'name', 'description', 'extra_snail_fact')
def get_extra_snail_fact(self, obj):
return 'snails really can’t swim:('
SerializerMethodField
21. Django REST Framework is really powerful for making APIs
out of Django applications.
For something more lightweight I would probably recommend
flask.
Conclusion