What it’s really like building RESTful APIs with Django
Paul Hallett
@phalt_
Lessons learnt from converting a big legacy app to RESTful API
- Working for lyst
- old API was basically rpc style - doesn’t match well to HTTP
- used just one URL api.lyst.com/rpc/v1/
- use POST even when just getting stuff
- really hard to debug
Rebuild with Django REST Framework
- Why?
- Batteries included API framework
What was learned
- good opportunity to look at what you have and think about what’s been learnt
- examine technical debt
- what does the mobile app care about
- products
- users, registration
- design first, code second
- resources (in the REST sense)
- they don’t always map directly to models
- eg model Cart - loads of fields, no separation of concerns
- DRF Serializers
- similar to Django forms
- link to model, list the fields you want to include
- so can have 3 resources based on single model, with different subsets of fields
- and lots of other flexible options
- DRF Routers
- great for a CRUD based service, but if different might ignore it
- DRF Permissions
- set DEFAULT_PERMISSION_CLASSES to AdminOnly
- then set them for each view with permission_classes class attribute
- DRF Authentication
- even if you have one consumer, should still have auth
- I recommend token auth for simple cases
- more complex, use OAuth2
- bit of a headache to install, but much more powerful
- eg can expire a permission
- pip install django-oauth2-toolkit
HTTP
- HTTP only provides so much
- HTTP checkout (process and purchase items)
- initial thought make a new HTTP verb
- went for HTTP POST https://api.lyst.com/cart/checkout/
- pass in ID for card
Asynchronous
- shouldn’t care about other things going on
- timeouts
- clients can poll
- we tried “web hook”
- callback_url, push_notification
- send a HTTP1.1 202 ACCEPTED
Documentation
- your API can be great, but without docs it’s a bad API
- swagger can auto-generate docs
- but sometimes you’re bending the standard REST rules, so just wrote our own
- in particular doc the auth - how do I get a token
- give some curl examples