Top Banner
Django REST Framework Jenny Olsson Load Impact
22

Django REST Framework

Apr 16, 2017

Download

Technology

Load Impact
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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