Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Django REST Framework
API
Masashi SHIBATA
c-bata c_bata_! "
PyCon JP 2018 Day1
go-prompt, kube-prompt


https://codezine.jp/article/corner/749
c-bata c_bata_! "
Topic 1
PageNumberPagination
CursorPagination
LimitOffsetPagination
CLASS
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=5&offset=400
prev: http://exam...
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=5&offset=400
prev: http://exam...
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=50&offset=250
prev: http://exa...
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=50&offset=250
prev: http://exa...
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=50&offset=250
prev: http://exa...
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=50&offset=250
prev: http://exa...
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=50&offset=250
prev: http://exa...
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=50&offset=250
prev: http://exa...
http://example.com/snippets/?page=4
PageNumberPagination
http://example.com/snippets/?limit=50&offset=250
prev: http://exa...
1 74 102 85 113 96 12
1 74 102 85 113 96 12
1 74 102 85 113 96 12
1 74 102 85 113 96 12
1 74 102 85 113 96 12
id = 3
id=6
1 74 102 85 113 96 12
1 74 102 85 113 96 12
1 74 102 85 113 96 121 74 102 85 113 96 12
1 74 102 85 113 96 12
5
1
1 74 102 85 113 96 12
1 74 102 85 113 96 12
1 74 102 85 113 96 12
1 74 102 85 113 96 12
id id id id id id id id
3
id id id id id id id id id id id id id id id id
id id id id id id id id id id id id id id id id
id id id id id id id id id id id id id id id id
id id id id id id id id id id id id id id id id


=
SELECT id FROM snippets
WHERE is_public = 1
AND created_at > '2018-09-15 08:28:53.312612’
ORDER BY created_at ASC LIMIT ...
INDEX
D, J, Z
INDEX
A, B, D
+
A 1
INDEX
F, H, J B 8
INDEX
L, P, Z D 20
INDEX
20, 60, 80
INDEX
1, 8, 20
+
1 c-bata 24
INDEX...
INDEX
D, J, Z
INDEX
A, B, D
+
A 1
INDEX
F, H, J B 8
INDEX
L, P, Z D 20
INDEX
20, 60, 80
INDEX
1, 8, 20
+
1 c-bata 24
INDEX...
INDEX
D, J, Z
INDEX
A, B, D
+
A 1
INDEX
F, H, J B 8
INDEX
L, P, Z D 20
INDEX
20, 60, 80
INDEX
1, 8, 20
+
1 c-bata 24
INDEX...
INDEX
D, J, Z
INDEX
A, B, D
+
A 1
INDEX
F, H, J B 8
INDEX
L, P, Z D 20
INDEX
20, 60, 80
INDEX
1, 8, 20
+
1 c-bata 24
INDEX...
INDEX
D, J, Z
INDEX
A, B, D
+
A 1
INDEX
F, H, J B 8
INDEX
L, P, Z D 20
INDEX
20, 60, 80
INDEX
1, 8, 20
+
1 c-bata 24
INDEX...
INDEX
D, J, Z
INDEX
A, B, D
+
A 1
INDEX
F, H, J B 8
INDEX
L, P, Z D 20
INDEX
20, 60, 80
INDEX
1, 8, 20
+
1 c-bata 24
INDEX...
SELECT id FROM snippets
WHERE is_public = 1
AND created_at > '2018-09-15 08:28:53.312612’
ORDER BY created_at ASC LIMIT 10...
SELECT id FROM snippets
WHERE is_public = 1
AND created_at > '2018-09-15 08:28:53.312612’
ORDER BY created_at ASC LIMIT 10...
SELECT id FROM snippets
WHERE is_public = 1
AND created_at > '2018-09-15 08:28:53.312612’
ORDER BY created_at ASC LIMIT 10...
SELECT id FROM snippets
WHERE is_public = 1
AND created_at > '2018-09-15 08:28:53.312612’
ORDER BY created_at ASC LIMIT 10...
Topic 2
AnonRateThrottle
ScopedRateThrottle
UserRateThrottle
KEYWORDS
•
• CDN (akamai, fastly, cloudflare, …)
• (Nginx, apache, …)
• Django
• AnonRateThrottle
• UserRateThrottle
• ScopedRateThr...
• CDN Rate Limiting, DDoS Protection
• https://docs.fastly.com/api/
• https://developer.akamai.com/blog/2018/05/30/
demyst...
• AnonRateThrottle:
• IP (X-Forwarded-For WSGI environ
REMOTE_ADDR )
• UserRateThrottle:
•
• ScopedRateThrottle:
•
• AnonRateThrottle:
• IP (X-Forwarded-For WSGI environ
REMOTE_ADDR )
• UserRateThrottle:
•
• ScopedRateThrottle:
•
CDN Ngi...
• AnonRateThrottle:
• IP (X-Forwarded-For WSGI environ
REMOTE_ADDR )
• UserRateThrottle:
•
• ScopedRateThrottle:
•
Github
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
‘rest_framework.throttling.AnonRateThrottle',
‘rest_framework.throttling....
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
‘rest_framework.throttling.AnonRateThrottle',
‘rest_framework.throttling....
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
‘rest_framework.throttling.AnonRateThrottle',
‘rest_framework.throttling....
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
‘rest_framework.throttling.AnonRateThrottle',
‘rest_framework.throttling....
https://github.com/c-bata/django-api-practices
•
• clients/dos.py : 10
• clients/throttle_client.py :
•
• RATE_LIMIT=true
...
•
• clients/dos.py : 10
• clients/throttle_client.py :
•
• RATE_LIMIT=true
• anon: 3req/s , user: 10req/s
https://github.c...
• CDN Nginx
• REST Framework 3
• UserRateLimit
• Rate Limit 

Topic 3
TokenAuthentication JWT
TokenAuthentication
djangorestframework-jwt
CLASS
• TokenAuthentication:
• djangorestframework-jwt: JSON Web Token
• https://github.com/GetBlimp/django-rest-framework-jwt
•...
JWT
JSON Web Token
Claim JSON 

( RFC7519)
https://jwt.io
https://jwt.io
{header}.{payload}.{signature}
header claims urlsafe base64 encode
https://jwt.io
( JWT)
https://jwt.io
payload urlsafe base64 decode
RS HS
• HMAC: ) HS256
•
•
•
• : ) RS256. PS ES
•
•
RS HS
• HMAC: ) HS256
•
•
•
• : ) RS256
•
•


HMAC
RS HS
• HMAC: ) HS256
•
•
•
• : ) RS256
•
•
djangorestframework-jwt 

HS256
RS HS
• HMAC: ) HS256
•
•
•
• : ) RS256
•
•




) Firebase JWT
RS HS
• HMAC: ) HS256
•
•
•
• : ) RS256
•
•
https://pyjwt.readthedocs.io/en/latest/algorithms.html
PyJWT
• TokenAuthentication
• djangorestframework-jwt
• JWT
• JWT
• HMAC
•
Topic 4
HATEOAS
Versioning
Specifying media type
KEYWORDS
• HATEOAS (Hypertext As The Engine Of Application State)
•
•
•
API
Django REST Framework
HATEOAS
Hypertext As The Engine Of Application State
URI 

API DefaultRouter 

HyperLinkedModelSerializer
$ curl http://lo...


• rest_framework.urlpatterns.format_suffix_patterns


• rest_framework.urlpatterns.format_suffix_patterns 

$ curl -H 'Accept: text/html' <your api endpoint>
BrowsableAPIRender...
$ curl -u user:pass -d '{}' 
> http://127.0.0.1:8000/api/snippets/ | jq .
{
"title": [
" "
],
"created_by": [
" "
]
}
example.com/v1.0/snippets

example.com/snippets?v=2.0
v1.example.com/snippets
Accept: application/json; version=3.0
•
•
• JWT
•
THANK YOU
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Upcoming SlideShare
Loading in …5
×

of

Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 1 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 2 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 3 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 4 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 5 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 6 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 7 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 8 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 9 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 10 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 11 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 12 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 13 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 14 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 15 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 16 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 17 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 18 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 19 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 20 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 21 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 22 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 23 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 24 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 25 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 26 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 27 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 28 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 29 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 30 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 31 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 32 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 33 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 34 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 35 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 36 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 37 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 38 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 39 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 40 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 41 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 42 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 43 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 44 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 45 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 46 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 47 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 48 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 49 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 50 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 51 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 52 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 53 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 54 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 55 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 56 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 57 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 58 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 59 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 60 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 61 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 62 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 63 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 64 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 65 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 66 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 67 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 68 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 69 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 70 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 71 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 72 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 73 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 74 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 75 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 76 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 77 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 78 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 79 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 80 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 81 Django REST Framework における API 実装プラクティス | PyCon JP 2018 Slide 82

YouTube videos are no longer supported on SlideShare

View original on YouTube

Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

11 Likes

Share

Download to read offline

Django REST Framework における API 実装プラクティス | PyCon JP 2018

Download to read offline

Django REST Framework におけるAPI 実装プラクティス at PyCon JP 2018

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Django REST Framework における API 実装プラクティス | PyCon JP 2018

  1. 1. Django REST Framework API Masashi SHIBATA c-bata c_bata_! " PyCon JP 2018 Day1
  2. 2. go-prompt, kube-prompt 
 https://codezine.jp/article/corner/749 c-bata c_bata_! "
  3. 3. Topic 1 PageNumberPagination CursorPagination LimitOffsetPagination CLASS
  4. 4. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=5&offset=400 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination
  5. 5. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=5&offset=400 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination per_page
  6. 6. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=50&offset=250 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination (offset) (limit) page
  7. 7. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=50&offset=250 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination ID( ) ( )
  8. 8. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=50&offset=250 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination
  9. 9. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=50&offset=250 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination (or )
  10. 10. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=50&offset=250 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination ※ max_id since_id examle.com/snippets?since_id=6
  11. 11. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=50&offset=250 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination id or
  12. 12. http://example.com/snippets/?page=4 PageNumberPagination http://example.com/snippets/?limit=50&offset=250 prev: http://example.com/snippets/?cursor=cj0xJnA9MjAxOC next: http://example.com/snippets/?cursor=povlJDFkfhgf0lAj LimitOffsetPagination CursorPagination
  13. 13. 1 74 102 85 113 96 12
  14. 14. 1 74 102 85 113 96 12 1 74 102 85 113 96 12
  15. 15. 1 74 102 85 113 96 12 1 74 102 85 113 96 12 id = 3 id=6
  16. 16. 1 74 102 85 113 96 12 1 74 102 85 113 96 12
  17. 17. 1 74 102 85 113 96 121 74 102 85 113 96 12 1 74 102 85 113 96 12 5 1
  18. 18. 1 74 102 85 113 96 12 1 74 102 85 113 96 12
  19. 19. 1 74 102 85 113 96 12 1 74 102 85 113 96 12
  20. 20. id id id id id id id id 3
  21. 21. id id id id id id id id id id id id id id id id
  22. 22. id id id id id id id id id id id id id id id id
  23. 23. id id id id id id id id id id id id id id id id
  24. 24. id id id id id id id id id id id id id id id id
  25. 25.
  26. 26. = SELECT id FROM snippets WHERE is_public = 1 AND created_at > '2018-09-15 08:28:53.312612’ ORDER BY created_at ASC LIMIT 101; ALTER TABLE snippets ADD INDEX ix_created_public(created_at, is_public); SQL Index
  27. 27. INDEX D, J, Z INDEX A, B, D + A 1 INDEX F, H, J B 8 INDEX L, P, Z D 20 INDEX 20, 60, 80 INDEX 1, 8, 20 + 1 c-bata 24 INDEX 21, 50, 60 + 8 denari 23 INDEX 65, 76, 80 + 20 cstoku 25 (InnoDB)
  28. 28. INDEX D, J, Z INDEX A, B, D + A 1 INDEX F, H, J B 8 INDEX L, P, Z D 20 INDEX 20, 60, 80 INDEX 1, 8, 20 + 1 c-bata 24 INDEX 21, 50, 60 + 8 denari 23 INDEX 65, 76, 80 + 20 cstoku 25 (InnoDB)
  29. 29. INDEX D, J, Z INDEX A, B, D + A 1 INDEX F, H, J B 8 INDEX L, P, Z D 20 INDEX 20, 60, 80 INDEX 1, 8, 20 + 1 c-bata 24 INDEX 21, 50, 60 + 8 denari 23 INDEX 65, 76, 80 + 20 cstoku 25 (InnoDB) INDEX
  30. 30. INDEX D, J, Z INDEX A, B, D + A 1 INDEX F, H, J B 8 INDEX L, P, Z D 20 INDEX 20, 60, 80 INDEX 1, 8, 20 + 1 c-bata 24 INDEX 21, 50, 60 + 8 denari 23 INDEX 65, 76, 80 + 20 cstoku 25 (InnoDB)
  31. 31. INDEX D, J, Z INDEX A, B, D + A 1 INDEX F, H, J B 8 INDEX L, P, Z D 20 INDEX 20, 60, 80 INDEX 1, 8, 20 + 1 c-bata 24 INDEX 21, 50, 60 + 8 denari 23 INDEX 65, 76, 80 + 20 cstoku 25 (InnoDB) OFFSET
  32. 32. INDEX D, J, Z INDEX A, B, D + A 1 INDEX F, H, J B 8 INDEX L, P, Z D 20 INDEX 20, 60, 80 INDEX 1, 8, 20 + 1 c-bata 24 INDEX 21, 50, 60 + 8 denari 23 INDEX 65, 76, 80 + 20 cstoku 25 (InnoDB)
  33. 33. SELECT id FROM snippets WHERE is_public = 1 AND created_at > '2018-09-15 08:28:53.312612’ ORDER BY created_at ASC LIMIT 101; ALTER TABLE snippets ADD INDEX ix_created_public(created_at, is_public); SQL Index
  34. 34. SELECT id FROM snippets WHERE is_public = 1 AND created_at > '2018-09-15 08:28:53.312612’ ORDER BY created_at ASC LIMIT 101; ALTER TABLE snippets ADD INDEX ix_created_public(created_at, is_public); SQL Index id, is_public, created_at
  35. 35. SELECT id FROM snippets WHERE is_public = 1 AND created_at > '2018-09-15 08:28:53.312612’ ORDER BY created_at ASC LIMIT 101; ALTER TABLE snippets ADD INDEX ix_created_public(created_at, is_public); SQL Index id, is_public, created_at
  36. 36. SELECT id FROM snippets WHERE is_public = 1 AND created_at > '2018-09-15 08:28:53.312612’ ORDER BY created_at ASC LIMIT 101; ALTER TABLE snippets ADD INDEX ix_created_public(created_at, is_public); SQL Index id, is_public, created_at created_at is_public
  37. 37. Topic 2 AnonRateThrottle ScopedRateThrottle UserRateThrottle KEYWORDS
  38. 38. • • CDN (akamai, fastly, cloudflare, …) • (Nginx, apache, …) • Django • AnonRateThrottle • UserRateThrottle • ScopedRateThrottle
  39. 39. • CDN Rate Limiting, DDoS Protection • https://docs.fastly.com/api/ • https://developer.akamai.com/blog/2018/05/30/ demystifying-api-rate-limiting • • https://www.nginx.com/blog/rate-limiting-nginx/
  40. 40. • AnonRateThrottle: • IP (X-Forwarded-For WSGI environ REMOTE_ADDR ) • UserRateThrottle: • • ScopedRateThrottle: •
  41. 41. • AnonRateThrottle: • IP (X-Forwarded-For WSGI environ REMOTE_ADDR ) • UserRateThrottle: • • ScopedRateThrottle: • CDN Nginx
  42. 42. • AnonRateThrottle: • IP (X-Forwarded-For WSGI environ REMOTE_ADDR ) • UserRateThrottle: • • ScopedRateThrottle: • Github
  43. 43. REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( ‘rest_framework.throttling.AnonRateThrottle', ‘rest_framework.throttling.UserRateThrottle', ), 'DEFAULT_THROTTLE_RATES': { 'anon': ‘10/min', 'user': ‘100/min' } }
  44. 44. REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( ‘rest_framework.throttling.AnonRateThrottle', ‘rest_framework.throttling.UserRateThrottle', ), 'DEFAULT_THROTTLE_RATES': { 'anon': ‘10/min', 'user': ‘100/min' } } sec, min, hour, day 1 s m, h, d
  45. 45. REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( ‘rest_framework.throttling.AnonRateThrottle', ‘rest_framework.throttling.UserRateThrottle', ), 'DEFAULT_THROTTLE_RATES': { 'anon': ‘10/min', 'user': ‘100/min' } } Django LocalMemCache
  46. 46. REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( ‘rest_framework.throttling.AnonRateThrottle', ‘rest_framework.throttling.UserRateThrottle', ), 'DEFAULT_THROTTLE_RATES': { 'anon': ‘10/min', 'user': ‘100/min' } } Github RateThrottle
  47. 47. https://github.com/c-bata/django-api-practices • • clients/dos.py : 10 • clients/throttle_client.py : • • RATE_LIMIT=true • anon: 3req/s , user: 10req/s
  48. 48. • • clients/dos.py : 10 • clients/throttle_client.py : • • RATE_LIMIT=true • anon: 3req/s , user: 10req/s https://github.com/c-bata/django-api-practices TokenBucketAlgorithm Python 2 14
  49. 49. • CDN Nginx • REST Framework 3 • UserRateLimit • Rate Limit 

  50. 50. Topic 3 TokenAuthentication JWT TokenAuthentication djangorestframework-jwt CLASS
  51. 51. • TokenAuthentication: • djangorestframework-jwt: JSON Web Token • https://github.com/GetBlimp/django-rest-framework-jwt • Refresh JWT
  52. 52. JWT JSON Web Token Claim JSON ( RFC7519)
  53. 53. https://jwt.io
  54. 54. https://jwt.io {header}.{payload}.{signature} header claims urlsafe base64 encode
  55. 55. https://jwt.io ( JWT)
  56. 56. https://jwt.io payload urlsafe base64 decode
  57. 57. RS HS • HMAC: ) HS256 • • • • : ) RS256. PS ES • •
  58. 58. RS HS • HMAC: ) HS256 • • • • : ) RS256 • • HMAC
  59. 59. RS HS • HMAC: ) HS256 • • • • : ) RS256 • • djangorestframework-jwt HS256
  60. 60. RS HS • HMAC: ) HS256 • • • • : ) RS256 • • ) Firebase JWT
  61. 61. RS HS • HMAC: ) HS256 • • • • : ) RS256 • • https://pyjwt.readthedocs.io/en/latest/algorithms.html PyJWT
  62. 62. • TokenAuthentication • djangorestframework-jwt • JWT • JWT • HMAC •
  63. 63. Topic 4 HATEOAS Versioning Specifying media type KEYWORDS
  64. 64. • HATEOAS (Hypertext As The Engine Of Application State) • • • API Django REST Framework
  65. 65. HATEOAS Hypertext As The Engine Of Application State URI 
 API DefaultRouter HyperLinkedModelSerializer $ curl http://localhost:8000/api/ | jq . { "snippets": "http://localhost:8000/api/snippets/" "users": “http://localhost:8000/api/users/“ }
  66. 66. 
 • rest_framework.urlpatterns.format_suffix_patterns
  67. 67. 
 • rest_framework.urlpatterns.format_suffix_patterns $ curl -H 'Accept: text/html' <your api endpoint> BrowsableAPIRenderer
  68. 68. $ curl -u user:pass -d '{}' > http://127.0.0.1:8000/api/snippets/ | jq . { "title": [ " " ], "created_by": [ " " ] }
  69. 69. example.com/v1.0/snippets example.com/snippets?v=2.0 v1.example.com/snippets Accept: application/json; version=3.0
  70. 70. • • • JWT •
  71. 71. THANK YOU
  • mgoldchild

    Aug. 15, 2019
  • dcomrpc

    Jan. 22, 2019
  • objectx

    Dec. 19, 2018
  • silverrin

    Oct. 30, 2018
  • anonaka

    Oct. 5, 2018
  • shinyorke

    Sep. 24, 2018
  • oghi57

    Sep. 21, 2018
  • koutt6

    Sep. 18, 2018
  • yumios

    Sep. 18, 2018
  • ShunSonohara

    Sep. 18, 2018
  • ChanFuku10

    Sep. 17, 2018

Django REST Framework におけるAPI 実装プラクティス at PyCon JP 2018

Views

Total views

19,346

On Slideshare

0

From embeds

0

Number of embeds

11,312

Actions

Downloads

26

Shares

0

Comments

0

Likes

11

×