SlideShare une entreprise Scribd logo
1  sur  33
Write an API for Almost Anything
DjangoCon 2017
The Amazing Power and Flexibility of
Django Rest Framework
Who Am I?
●Web Developer at Caktus Group
●Organizer of PyLadies RDU
●Builder and User of APIs
Note: Slides available at:
http://cakt.us/DjangoCon2017talk
What does “API” mean, anyway?
● “Application Programming Interface”
● Definition (techtarget.com): “An application program
interface (API) is
code that allows two software programs to
communicate with each other.”
Why Are APIs Useful?
●Flexibility
●Access (internally and externally)
●Future-proofing
Example: Customized Output
●Massage therapist needed schedule
information to be sharable without client
information
●Scheduling software did not do this
○But did have an API!
Example: Customized Output
●Small script can pull schedule information
and post without client information to a
shareable calendar
●API made it possible to create an otherwise
nonexistent feature
APIs for Non-Web Applications
●Easy and practical enough to be useful for
other distributed applications
●Example: Game back-end
○https://github.com/flowerncsu/ecgc-2017
Internal Separation
●Dynamic, highly interactive pages require
JavaScript
●Use API to separate Django code from
JavaScript code
Internal Separation
●Cleaner code
●Easier to use JS frameworks
●Retrieve data and context with simple
requests
APIs Are Awesome, So
How Do I Build One?
Building an API
●Many ways, many packages
●Django Rest Framework
○Sits nicely on top of existing Django code
○Very thorough feature set
Anatomy of Django Rest Framework
API
Router
ViewSet
Serializer
Django Models/
Database
serializers.py
views.py
urls.py
Anatomy of Django Rest Framework
API
Serializer
Django Models/
Database
Building the Serializer
from rest_framework import serializers
from .models import MyModel
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = (
'id',
'name',
'category',
)
Anatomy of Django Rest Framework
API
ViewSet
Serializer
Django Models/
Database
Building the ViewSet
from rest_framework import viewsets
from .models import MyModel
from .serializers import MyModelSerializer
class MyModelViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows MyModel instances
to be viewed or edited.
"""
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
Anatomy of Django Rest Framework
API
Router
ViewSet
Serializer
Django Models/
Database
Building URLs with the Router
from django.conf.urls import url, include
from rest_framework import routers
from myapp import views as myapp_api
router = routers.DefaultRouter()
router.register(r'mymodel', myapp_api.MyModelViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls',
namespace='rest_framework'))
]
Accessing the API
HTTP Methods Operations
●C
●R
●U
●D
Accessing the API
HTTP Methods
● POST
Operations
●Create
●R
●U
●D
Accessing the API
HTTP Methods
● POST
● GET
Operations
●Create
●Read
●U
●D
Accessing the API
HTTP Methods
● POST
● GET
● PUT
● PATCH
Operations
●Create
●Read
●Update
●D
Accessing the API
HTTP Methods
● POST
● GET
● PUT
● PATCH
● DELETE
Operations
●Create
●Read
●Update
●Delete
Accessing the API
HTTP Methods
● POST
● GET
● PUT
● PATCH
● DELETE
Operations
●Create
●Read
●Update
●Delete
Accessing the API
router.register(r'mymodel', myapp_api.MyModelViewSet)
(GET) myapp.com/mymodel
-> List of instances, fields based on serializer
(POST) myapp.com/mymodel
-> Create a new instance
(GET) myapp.com/mymodel/instance_id
-> Get details for instance with instance_id
(DELETE) myapp.com/mymodel/instance_id
-> Delete instance with instance_id
More information:
http://www.django-rest-framework.org/api-guide/viewsets/
What If I Don’t Want Users Doing That?
Several options to protect data:
●Authentication
●Read-only Viewsets
●Restricting specific actions
Documentation
●Key to usability of the API
●Structure is predictable
○URL and HTTP method
○Operation performed at that URL/method
○Parameters expected
○Data format returned
More information:
http://www.django-rest-framework.org/topics/documenting-your-api/
Automatic Documentation
from rest_framework.documentation import include_docs_urls
...
urlpatterns = [
...
url(r'^docs/', include_docs_urls(title='My API'))
]
More information:
http://www.django-rest-framework.org/topics/documenting-your-api/
Tests
● API functionality can be tested simply
●Automated tests mean “set it and forget it”
●Test failures can highlight changes that
should be reflected in documentation
Sample Test
from rest_framework.test import APITestCase
class TestMyModelViewSet(APITestCase):
def setUp(self):
self.url = reverse('mymodel-list')
self.instances = [MyModel() for i in range(3)]
for item in self.instances:
item.save()
def test_list_view(self):
response = self.client.get(self.url, format='json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 3)
More information:
http://www.django-rest-framework.org/api-guide/testing/
Sample Test
def test_can_create(self):
data = {'name': 'test name', 'category': 1}
response = self.client.post(
self.url, data, format='json')
self.assertEqual(response.status_code, 201)
def test_detail_view(self):
sample_id = MyModel.objects.first().id
detail_url = self.url + '/' + str(sample_id)
response = self.client.get(detail_url, format='json')
self.assertEqual(response.status_code, 200)
More information:
http://www.django-rest-framework.org/api-guide/testing/
Homework!
●What Django projects do you have live?
○In development?
●Do they have public information?
●Collections of user data?
●Can’t think of a use? Users will!
Resources
Django Rest Framework Quickstart:
http://www.django-rest-framework.org/tutorial/quickstart/
Example Project:
https://github.com/flowerncsu/ecgc-2017
These Slides:
http://cakt.us/DjangoCon2017talk
Caktus Group:
@caktusgroup
https://www.caktusgroup.com/
My Twitter:
@charlottecodes

Contenu connexe

Tendances

Documentation-driven development for Python web APIs v2
Documentation-driven development for Python web APIs v2Documentation-driven development for Python web APIs v2
Documentation-driven development for Python web APIs v2
José Haro Peralta
 

Tendances (20)

Swagger 2.0 and Model-driven APIs
Swagger 2.0 and Model-driven APIsSwagger 2.0 and Model-driven APIs
Swagger 2.0 and Model-driven APIs
 
Angular coding: from project management to web and mobile deploy
Angular coding: from project management to web and mobile deployAngular coding: from project management to web and mobile deploy
Angular coding: from project management to web and mobile deploy
 
Introducing swagger
Introducing swaggerIntroducing swagger
Introducing swagger
 
Swagger in the API Lifecycle
Swagger in the API LifecycleSwagger in the API Lifecycle
Swagger in the API Lifecycle
 
Type Annotations in Python: Whats, Whys and Wows!
Type Annotations in Python: Whats, Whys and Wows!Type Annotations in Python: Whats, Whys and Wows!
Type Annotations in Python: Whats, Whys and Wows!
 
AngularJS: Service, factory & provider
AngularJS: Service, factory & providerAngularJS: Service, factory & provider
AngularJS: Service, factory & provider
 
Angular 2 : le réveil de la force
Angular 2 : le réveil de la forceAngular 2 : le réveil de la force
Angular 2 : le réveil de la force
 
Documentation-driven development for Python web APIs v2
Documentation-driven development for Python web APIs v2Documentation-driven development for Python web APIs v2
Documentation-driven development for Python web APIs v2
 
Writer APIs in Java faster with Swagger Inflector
Writer APIs in Java faster with Swagger InflectorWriter APIs in Java faster with Swagger Inflector
Writer APIs in Java faster with Swagger Inflector
 
Design Driven API Development
Design Driven API DevelopmentDesign Driven API Development
Design Driven API Development
 
apidays LIVE Paris 2021 - Using OpenAPI to configure your API Gateway by Ole ...
apidays LIVE Paris 2021 - Using OpenAPI to configure your API Gateway by Ole ...apidays LIVE Paris 2021 - Using OpenAPI to configure your API Gateway by Ole ...
apidays LIVE Paris 2021 - Using OpenAPI to configure your API Gateway by Ole ...
 
Iterative Development with Swagger on the JDK
Iterative Development with Swagger on the JDKIterative Development with Swagger on the JDK
Iterative Development with Swagger on the JDK
 
React native
React nativeReact native
React native
 
API Design first with Swagger
API Design first with SwaggerAPI Design first with Swagger
API Design first with Swagger
 
AzovDevMeetup 2016 | Angular 2: обзор | Александр Шевнин
AzovDevMeetup 2016 | Angular 2: обзор | Александр ШевнинAzovDevMeetup 2016 | Angular 2: обзор | Александр Шевнин
AzovDevMeetup 2016 | Angular 2: обзор | Александр Шевнин
 
Introducing wsgi_lineprof / PyCon JP 2017 LT
Introducing wsgi_lineprof / PyCon JP 2017 LTIntroducing wsgi_lineprof / PyCon JP 2017 LT
Introducing wsgi_lineprof / PyCon JP 2017 LT
 
Angular EE - Special Workshop by Nir Kaufman
Angular EE - Special Workshop by Nir KaufmanAngular EE - Special Workshop by Nir Kaufman
Angular EE - Special Workshop by Nir Kaufman
 
Swagger for-your-api
Swagger for-your-apiSwagger for-your-api
Swagger for-your-api
 
Swagger - make your API accessible
Swagger - make your API accessibleSwagger - make your API accessible
Swagger - make your API accessible
 
Corley cloud angular in cloud
Corley cloud   angular in cloudCorley cloud   angular in cloud
Corley cloud angular in cloud
 

Similaire à Write an API for Almost Anything: The Amazing Power and Flexibility of Django Rest Framework

Build Android App using GCE & GAE
Build Android App using GCE & GAEBuild Android App using GCE & GAE
Build Android App using GCE & GAE
Love Sharma
 
Google api應用入門
Google api應用入門Google api應用入門
Google api應用入門
Simon Su
 

Similaire à Write an API for Almost Anything: The Amazing Power and Flexibility of Django Rest Framework (20)

Write an API for Almost Anything: The Amazing Power and Flexibility of Django...
Write an API for Almost Anything: The Amazing Power and Flexibility of Django...Write an API for Almost Anything: The Amazing Power and Flexibility of Django...
Write an API for Almost Anything: The Amazing Power and Flexibility of Django...
 
APIdays Paris 2014 - Workshop - Craft and Deploy Your API in a Few Clicks Wit...
APIdays Paris 2014 - Workshop - Craft and Deploy Your API in a Few Clicks Wit...APIdays Paris 2014 - Workshop - Craft and Deploy Your API in a Few Clicks Wit...
APIdays Paris 2014 - Workshop - Craft and Deploy Your API in a Few Clicks Wit...
 
Creating a custom API for a headless Drupal
Creating a custom API for a headless DrupalCreating a custom API for a headless Drupal
Creating a custom API for a headless Drupal
 
Introduction to Apigility
Introduction to ApigilityIntroduction to Apigility
Introduction to Apigility
 
Apigility introduction v2 (glasgow php)
Apigility introduction v2 (glasgow php)Apigility introduction v2 (glasgow php)
Apigility introduction v2 (glasgow php)
 
Crafting APIs
Crafting APIsCrafting APIs
Crafting APIs
 
API Management for GraphQL
API Management for GraphQLAPI Management for GraphQL
API Management for GraphQL
 
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
 
Build Android App using GCE & GAE
Build Android App using GCE & GAEBuild Android App using GCE & GAE
Build Android App using GCE & GAE
 
Création d'application Ionic & Angular & Drupal 8
Création d'application Ionic & Angular & Drupal 8Création d'application Ionic & Angular & Drupal 8
Création d'application Ionic & Angular & Drupal 8
 
OpenAPI development with Python
OpenAPI development with PythonOpenAPI development with Python
OpenAPI development with Python
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
 
How to Create a Service in Choreo
How to Create a Service in ChoreoHow to Create a Service in Choreo
How to Create a Service in Choreo
 
Deploying GraphQL Services as Managed APIs
Deploying GraphQL Services as Managed APIsDeploying GraphQL Services as Managed APIs
Deploying GraphQL Services as Managed APIs
 
EuroPython 2013 - Python3 TurboGears Training
EuroPython 2013 - Python3 TurboGears TrainingEuroPython 2013 - Python3 TurboGears Training
EuroPython 2013 - Python3 TurboGears Training
 
202107 - Orion introduction - COSCUP
202107 - Orion introduction - COSCUP202107 - Orion introduction - COSCUP
202107 - Orion introduction - COSCUP
 
Google api應用入門
Google api應用入門Google api應用入門
Google api應用入門
 
Mumbai MuleSoft Meetup #15
Mumbai MuleSoft Meetup #15Mumbai MuleSoft Meetup #15
Mumbai MuleSoft Meetup #15
 
Introduction to Google Cloud Endpoints: Speed Up Your API Development
Introduction to Google Cloud Endpoints: Speed Up Your API DevelopmentIntroduction to Google Cloud Endpoints: Speed Up Your API Development
Introduction to Google Cloud Endpoints: Speed Up Your API Development
 
Api best practices
Api best practicesApi best practices
Api best practices
 

Dernier

AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 

Dernier (20)

The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 

Write an API for Almost Anything: The Amazing Power and Flexibility of Django Rest Framework

  • 1. Write an API for Almost Anything DjangoCon 2017 The Amazing Power and Flexibility of Django Rest Framework
  • 2. Who Am I? ●Web Developer at Caktus Group ●Organizer of PyLadies RDU ●Builder and User of APIs Note: Slides available at: http://cakt.us/DjangoCon2017talk
  • 3. What does “API” mean, anyway? ● “Application Programming Interface” ● Definition (techtarget.com): “An application program interface (API) is code that allows two software programs to communicate with each other.”
  • 4. Why Are APIs Useful? ●Flexibility ●Access (internally and externally) ●Future-proofing
  • 5. Example: Customized Output ●Massage therapist needed schedule information to be sharable without client information ●Scheduling software did not do this ○But did have an API!
  • 6. Example: Customized Output ●Small script can pull schedule information and post without client information to a shareable calendar ●API made it possible to create an otherwise nonexistent feature
  • 7. APIs for Non-Web Applications ●Easy and practical enough to be useful for other distributed applications ●Example: Game back-end ○https://github.com/flowerncsu/ecgc-2017
  • 8. Internal Separation ●Dynamic, highly interactive pages require JavaScript ●Use API to separate Django code from JavaScript code
  • 9. Internal Separation ●Cleaner code ●Easier to use JS frameworks ●Retrieve data and context with simple requests
  • 10. APIs Are Awesome, So How Do I Build One?
  • 11. Building an API ●Many ways, many packages ●Django Rest Framework ○Sits nicely on top of existing Django code ○Very thorough feature set
  • 12. Anatomy of Django Rest Framework API Router ViewSet Serializer Django Models/ Database serializers.py views.py urls.py
  • 13. Anatomy of Django Rest Framework API Serializer Django Models/ Database
  • 14. Building the Serializer from rest_framework import serializers from .models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = ( 'id', 'name', 'category', )
  • 15. Anatomy of Django Rest Framework API ViewSet Serializer Django Models/ Database
  • 16. Building the ViewSet from rest_framework import viewsets from .models import MyModel from .serializers import MyModelSerializer class MyModelViewSet(viewsets.ModelViewSet): """ API endpoint that allows MyModel instances to be viewed or edited. """ queryset = MyModel.objects.all() serializer_class = MyModelSerializer
  • 17. Anatomy of Django Rest Framework API Router ViewSet Serializer Django Models/ Database
  • 18. Building URLs with the Router from django.conf.urls import url, include from rest_framework import routers from myapp import views as myapp_api router = routers.DefaultRouter() router.register(r'mymodel', myapp_api.MyModelViewSet) urlpatterns = [ url(r'^', include(router.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) ]
  • 19. Accessing the API HTTP Methods Operations ●C ●R ●U ●D
  • 20. Accessing the API HTTP Methods ● POST Operations ●Create ●R ●U ●D
  • 21. Accessing the API HTTP Methods ● POST ● GET Operations ●Create ●Read ●U ●D
  • 22. Accessing the API HTTP Methods ● POST ● GET ● PUT ● PATCH Operations ●Create ●Read ●Update ●D
  • 23. Accessing the API HTTP Methods ● POST ● GET ● PUT ● PATCH ● DELETE Operations ●Create ●Read ●Update ●Delete
  • 24. Accessing the API HTTP Methods ● POST ● GET ● PUT ● PATCH ● DELETE Operations ●Create ●Read ●Update ●Delete
  • 25. Accessing the API router.register(r'mymodel', myapp_api.MyModelViewSet) (GET) myapp.com/mymodel -> List of instances, fields based on serializer (POST) myapp.com/mymodel -> Create a new instance (GET) myapp.com/mymodel/instance_id -> Get details for instance with instance_id (DELETE) myapp.com/mymodel/instance_id -> Delete instance with instance_id More information: http://www.django-rest-framework.org/api-guide/viewsets/
  • 26. What If I Don’t Want Users Doing That? Several options to protect data: ●Authentication ●Read-only Viewsets ●Restricting specific actions
  • 27. Documentation ●Key to usability of the API ●Structure is predictable ○URL and HTTP method ○Operation performed at that URL/method ○Parameters expected ○Data format returned More information: http://www.django-rest-framework.org/topics/documenting-your-api/
  • 28. Automatic Documentation from rest_framework.documentation import include_docs_urls ... urlpatterns = [ ... url(r'^docs/', include_docs_urls(title='My API')) ] More information: http://www.django-rest-framework.org/topics/documenting-your-api/
  • 29. Tests ● API functionality can be tested simply ●Automated tests mean “set it and forget it” ●Test failures can highlight changes that should be reflected in documentation
  • 30. Sample Test from rest_framework.test import APITestCase class TestMyModelViewSet(APITestCase): def setUp(self): self.url = reverse('mymodel-list') self.instances = [MyModel() for i in range(3)] for item in self.instances: item.save() def test_list_view(self): response = self.client.get(self.url, format='json') self.assertEqual(response.status_code, 200) self.assertEqual(len(response.data), 3) More information: http://www.django-rest-framework.org/api-guide/testing/
  • 31. Sample Test def test_can_create(self): data = {'name': 'test name', 'category': 1} response = self.client.post( self.url, data, format='json') self.assertEqual(response.status_code, 201) def test_detail_view(self): sample_id = MyModel.objects.first().id detail_url = self.url + '/' + str(sample_id) response = self.client.get(detail_url, format='json') self.assertEqual(response.status_code, 200) More information: http://www.django-rest-framework.org/api-guide/testing/
  • 32. Homework! ●What Django projects do you have live? ○In development? ●Do they have public information? ●Collections of user data? ●Can’t think of a use? Users will!
  • 33. Resources Django Rest Framework Quickstart: http://www.django-rest-framework.org/tutorial/quickstart/ Example Project: https://github.com/flowerncsu/ecgc-2017 These Slides: http://cakt.us/DjangoCon2017talk Caktus Group: @caktusgroup https://www.caktusgroup.com/ My Twitter: @charlottecodes