django rest framework

22
Django REST Framework Jenny Olsson Load Impact

Upload: load-impact

Post on 16-Apr-2017

288 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Django REST Framework

Django REST FrameworkJenny Olsson

Load Impact

Page 2: Django REST Framework

Framework for building REST applications

pip install djangorestframework

Django REST Framework (DRF)

Page 3: Django REST Framework

● URL-routing● Views/ViewSets● Serializers

What do you get from DRF:

Page 4: Django REST Framework

We’ll assume we’ve got:

● A Django Application● A Snail Model

Let’s build a snail API!

Page 5: Django REST Framework

Request:GET www.api.snails.com/snails/1

Reply:{'id': 1,

'name': 'Helix Aspersa',

'description': 'Common garden snail'}

Example

Page 6: Django REST Framework

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

Page 7: Django REST Framework

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

Page 8: Django REST Framework

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

Page 9: Django REST Framework

This is where you:

● Validate input● Format input data● Format output data

Serializers

Page 10: Django REST Framework

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

Page 11: Django REST Framework

Request:GET www.api.snails.com/snails/1

Reply:{'id': 1,

'name': 'Helix Aspersa',

'description': 'Common garden snail'}

Example

Page 12: Django REST Framework

● 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

Page 13: Django REST Framework

Standard REST endpoints are connected to resource:

POST /snails <-- create snailGET /snails <--- list snailsGET /snails/1 <--- get snailUPDATE /snails/1 <--- update snail

But what if we want:

POST /snails/1/befriend ← befriend snail

Non REST endpoints

Page 14: Django REST Framework

class SnailViewSet(viewsets.ModelViewSet):

@detail_route(methods=['post'])

def befriend(self, request, pk=None):

# Somehow befriend snail

return Response({'msg': 'Yay got snail friend'})

Use @detail_route or @list_route

Page 15: Django REST Framework

Since we use ViewSets the endpoint will be automatically routed.

We can now befriend snails by posting to:

/snails/1/befriend

Automatic routing FTW

Page 16: Django REST Framework

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

Page 17: Django REST Framework

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

Page 18: Django REST Framework

Request:GET www.api.snails.com/snails/1

Reply:{'id': 1,

'name': 'Helix Aspersa',

'description': 'Common garden snail',

'extra_snail_fact': 'snails really can’t swim:('}

Example

Page 19: Django REST Framework

But what if we DON’T want to return all the fields from our model?

class Snail(models.model):

super_embarrasing_hacky_field = 2

Removing fields

Page 20: Django REST Framework

class SnailSerializer(serializers.ModelSerializer):

class Meta:

model = models.Snail

fields = ('id', 'name', 'description') # Just don’t add it here

SerializerMethodField

Page 21: Django REST Framework

Django REST Framework is really powerful for making APIs out of Django applications.

For something more lightweight I would probably recommend flask.

Conclusion

Page 22: Django REST Framework

Thanks for listening!

Ping me later if you’ve got any questions!

That’s it