unrestful apis with django

18
UnRESTful APIs with Django Ari Lacenski @tensory June 25, 2013 Tuesday, June 25, 13

Upload: ari-lacenski

Post on 08-May-2015

277 views

Category:

Technology


3 download

DESCRIPTION

Designing APIs that depart from standard REST procedure to help overcome issues with REST operations on complex data. Using Django and TastyPie as development platforms.

TRANSCRIPT

Page 1: UnRESTful APIs with Django

UnRESTful APIs with DjangoAri Lacenski@tensoryJune 25, 2013

Tuesday, June 25, 13

Page 2: UnRESTful APIs with Django

Why create an API?

API stands for Application Programming Interface.

An API to your project lets people write applications that use your technology.

Web APIs are collections of URLs pointing to services.

Tuesday, June 25, 13

Page 3: UnRESTful APIs with Django

Remote Procedure Call

Uses URL patterns to suggest what you get backlike: yoursite.com/show/articles?article_id=42

Used to be super common, until REST pattern emerged

good luck with that

Often inconsistent & needs a lot of docs

Response data isn’t linked to DB records

Tuesday, June 25, 13

Page 4: UnRESTful APIs with Django

REST

(REpresentational State Transfer)

Uses HTTP concepts: GET, POST, DELETE & PUT

Super useful, super popular!

Lets you build an API that directly represents the data that you want developers to work with

Tuesday, June 25, 13

Page 5: UnRESTful APIs with Django

REST

GET /article/42 returns JSON representation of article with id=42

POST /article/ gets back JSON with a saved article ID

GET /article/ gets back a list of article IDs

{ ‘article’: { ‘id’: 42, ‘author’: ‘Becky Smith’, ‘title’: ‘API Design 101’ }}

Tuesday, June 25, 13

Page 6: UnRESTful APIs with Django

REST works great.

“RESTful API” designs try to follow the REST pattern.

There are free API libraries for Python web frameworks.

This all works well for creating APIs to relational data.

BUT WAIT

What if your data is too complex to store in a DB table?

Tuesday, June 25, 13

Page 7: UnRESTful APIs with Django

Extend your pattern.

Consider a photo service with some color search tools.

Upload a photo? POST to /upload/ with file + metadata

Get photo details? GET /photo/

Want to let your API users calculate the average color in some random images? ... Hmm.

Tuesday, June 25, 13

Page 8: UnRESTful APIs with Django

Let’s make it happen.

Tuesday, June 25, 13

Page 9: UnRESTful APIs with Django

models.pyfrom django.db import models

class Photo(models.Model): uploader = models.ForeignKey(User) uploaded_at = models.DateTimeField() file = models.FileField(blank=True, null=True)

How do you turn this model into an API?

Try Tastypie.

Tuesday, June 25, 13

Page 10: UnRESTful APIs with Django

from tastypie.resources import Resourcefrom models import Photo

class PhotoResource(Resource): class Meta(object): queryset = Photo.objects.all() resource_name = ‘photo’ allowed_methods = [‘get’, ‘post’, ‘put’]

api.py

Tuesday, June 25, 13

Page 11: UnRESTful APIs with Django

urls.pyfrom tastypie.api import Apifrom api import PhotoResource

photo_api = Api(api_name='api')urlpatterns = patterns(‘’, include(photo_api.urls))

# ... other routes in your app can go # into this urlpatterns definition, if you want

Tuesday, June 25, 13

Page 12: UnRESTful APIs with Django

Can we upload photos?

Can we get back one photo’s data?

Can we see data about all photos we’ve uploaded?

Yup.

Sure.

Check it out.

GET /api/photo/42

GET /api/photo/

POST /api/photo/

Where are we now?

Tuesday, June 25, 13

Page 13: UnRESTful APIs with Django

But what about that color method?

id=34id=60

id=29

Tuesday, June 25, 13

Page 14: UnRESTful APIs with Django

1. In api.py, add a method to your API’s PhotoResource.

2. In views.py, create any helper methods you need for your Photo model. 3. In api.py, use prepend_urls to add an RPC URL pattern for the new PhotoResource method.

Mix in an RPC URL.

Tuesday, June 25, 13

Page 15: UnRESTful APIs with Django

import viewsfrom tastypie.resources import Resourcefrom models import Photo

class PhotoResource(Resource): class Meta(object): queryset = Photo.objects.all() resource_name = ‘photo’ allowed_methods = [‘get’, ‘post’, ‘put’]

def prepend_urls(self): return [ url(r”^(?P<resource_name>)/average/” % self._meta.resource_name, self.wrap_view('get_average_color')) ]

def get_average_color(self, request): photo_ids = request.getlist(‘ids’)

# Add a get_average_color method to your app views. result = views.get_average_color(photo_ids) return { ‘color’: result.color_code }

api.py

Tuesday, June 25, 13

Page 16: UnRESTful APIs with Django

You’re done!

GET /api/photo/average?ids=34,60,29

{ ‘color’: ‘BAB5B2’ }

Tuesday, June 25, 13

Page 17: UnRESTful APIs with Django

Find out moreComparison of REST vs XML RPC http://bit.ly/8lkoPK

Django API packages comparison https://www.djangopackages.com/grids/g/api/

Tastypie http://django-tastypie.readthedocs.org/ https://github.com/toastdriven/django-tastypie

Tuesday, June 25, 13

Page 18: UnRESTful APIs with Django

Thanks for listening!

Ari Lacenski @tensory Tuesday, June 25, 13