SlideShare une entreprise Scribd logo
1  sur  18
Télécharger pour lire hors ligne
UnRESTful APIs
with Django
Ari Lacenski
@tensory
June 25, 2013
Tuesday, June 25, 13
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
Remote Procedure Call
Uses URL patterns to suggest what you get back
like: 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
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
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
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
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
Let’s make it happen.
Tuesday, June 25, 13
models.py
from 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
from tastypie.resources import Resource
from 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
urls.py
from tastypie.api import Api
from 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
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
But what about that
color method?
id=34
id=60
id=29
Tuesday, June 25, 13
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
import views
from tastypie.resources import Resource
from 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
You’re done!
GET /api/photo/average?ids=34,60,29
{ ‘color’: ‘BAB5B2’ }
Tuesday, June 25, 13
Find out more
Comparison 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
Thanks for listening!
Ari Lacenski @tensory
Tuesday, June 25, 13

Contenu connexe

Similaire à UnRESTful APIs with Django

Timeline SoMa WADE
Timeline SoMa WADETimeline SoMa WADE
Timeline SoMa WADEIrnuk
 
Art & music vs Google App Engine
Art & music vs Google App EngineArt & music vs Google App Engine
Art & music vs Google App Enginethomas alisi
 
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)Amazon Web Services
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to DjangoJoaquim Rocha
 
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 Minutes
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 MinutesDjangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 Minutes
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 MinutesNina Zakharenko
 
React HOCs, Context and Observables
React HOCs, Context and ObservablesReact HOCs, Context and Observables
React HOCs, Context and ObservablesTrayan Iliev
 
How to build an AngularJS backend-ready app WITHOUT BACKEND
How to build an AngularJS backend-ready app WITHOUT BACKEND How to build an AngularJS backend-ready app WITHOUT BACKEND
How to build an AngularJS backend-ready app WITHOUT BACKEND Enrique Oriol Bermúdez
 
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022Matt Raible
 
Building a Bibliography
Building a BibliographyBuilding a Bibliography
Building a BibliographyEric Aitala
 
Practical pairing of generative programming with functional programming.
Practical pairing of generative programming with functional programming.Practical pairing of generative programming with functional programming.
Practical pairing of generative programming with functional programming.Eugene Lazutkin
 
PHP Unit Testing in Yii
PHP Unit Testing in YiiPHP Unit Testing in Yii
PHP Unit Testing in YiiIlPeach
 
An introduction to Ember.js
An introduction to Ember.jsAn introduction to Ember.js
An introduction to Ember.jscodeofficer
 
Introduction to Google App Engine
Introduction to Google App EngineIntroduction to Google App Engine
Introduction to Google App EngineAndrea Spadaccini
 
d.mix: Programming by a Sample
d.mix: Programming by a Sampled.mix: Programming by a Sample
d.mix: Programming by a SampleLeslie W
 
Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkDaniel Spector
 
Advanced Web Development
Advanced Web DevelopmentAdvanced Web Development
Advanced Web DevelopmentRobert J. Stein
 
Get up and running with google app engine in 60 minutes or less
Get up and running with google app engine in 60 minutes or lessGet up and running with google app engine in 60 minutes or less
Get up and running with google app engine in 60 minutes or lesszrok
 

Similaire à UnRESTful APIs with Django (20)

Timeline SoMa WADE
Timeline SoMa WADETimeline SoMa WADE
Timeline SoMa WADE
 
Crafting [Better] API Clients
Crafting [Better] API ClientsCrafting [Better] API Clients
Crafting [Better] API Clients
 
Backbone
BackboneBackbone
Backbone
 
Art & music vs Google App Engine
Art & music vs Google App EngineArt & music vs Google App Engine
Art & music vs Google App Engine
 
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
Grails Advanced
Grails Advanced Grails Advanced
Grails Advanced
 
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 Minutes
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 MinutesDjangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 Minutes
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 Minutes
 
React HOCs, Context and Observables
React HOCs, Context and ObservablesReact HOCs, Context and Observables
React HOCs, Context and Observables
 
How to build an AngularJS backend-ready app WITHOUT BACKEND
How to build an AngularJS backend-ready app WITHOUT BACKEND How to build an AngularJS backend-ready app WITHOUT BACKEND
How to build an AngularJS backend-ready app WITHOUT BACKEND
 
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
Reactive Java Microservices with Spring Boot and JHipster - Spring I/O 2022
 
Building a Bibliography
Building a BibliographyBuilding a Bibliography
Building a Bibliography
 
Practical pairing of generative programming with functional programming.
Practical pairing of generative programming with functional programming.Practical pairing of generative programming with functional programming.
Practical pairing of generative programming with functional programming.
 
PHP Unit Testing in Yii
PHP Unit Testing in YiiPHP Unit Testing in Yii
PHP Unit Testing in Yii
 
An introduction to Ember.js
An introduction to Ember.jsAn introduction to Ember.js
An introduction to Ember.js
 
Introduction to Google App Engine
Introduction to Google App EngineIntroduction to Google App Engine
Introduction to Google App Engine
 
d.mix: Programming by a Sample
d.mix: Programming by a Sampled.mix: Programming by a Sample
d.mix: Programming by a Sample
 
Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end Framework
 
Advanced Web Development
Advanced Web DevelopmentAdvanced Web Development
Advanced Web Development
 
Get up and running with google app engine in 60 minutes or less
Get up and running with google app engine in 60 minutes or lessGet up and running with google app engine in 60 minutes or less
Get up and running with google app engine in 60 minutes or less
 

Dernier

Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 

Dernier (20)

Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 

UnRESTful APIs with Django

  • 1. UnRESTful APIs with Django Ari Lacenski @tensory June 25, 2013 Tuesday, June 25, 13
  • 2. 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
  • 3. Remote Procedure Call Uses URL patterns to suggest what you get back like: 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
  • 4. 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. Let’s make it happen. Tuesday, June 25, 13
  • 9. models.py from 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
  • 10. from tastypie.resources import Resource from 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
  • 11. urls.py from tastypie.api import Api from 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
  • 12. 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
  • 13. But what about that color method? id=34 id=60 id=29 Tuesday, June 25, 13
  • 14. 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
  • 15. import views from tastypie.resources import Resource from 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
  • 16. You’re done! GET /api/photo/average?ids=34,60,29 { ‘color’: ‘BAB5B2’ } Tuesday, June 25, 13
  • 17. Find out more Comparison 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
  • 18. Thanks for listening! Ari Lacenski @tensory Tuesday, June 25, 13