Rest in flask
-
Upload
yehor-nazarkin -
Category
Technology
-
view
4.258 -
download
0
description
Transcript of Rest in flask
![Page 1: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/1.jpg)
REST in Flaskraising����������� ������������������ the����������� ������������������ service
I am: Yehor NazarkinFollow me: @nimnullEmail me: [email protected]
Saturday, June 2, 12
![Page 2: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/2.jpg)
RESTin����������� ������������������ pieces• Representative state transfer
• Hypertext transfer protocol:✓ URL endpoint as resource address
✓ Content-Type
✓ Status codes
• The Web is REST
Saturday, June 2, 12
![Page 3: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/3.jpg)
RESTin����������� ������������������ pieces
Backends
Web Front Mobile client
API
Saturday, June 2, 12
![Page 4: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/4.jpg)
Why Flask? as����������� ������������������ we����������� ������������������ already����������� ������������������ have����������� ������������������ tones����������� ������������������ of����������� ������������������ stuff• I’m not a framework junkie
• I want to customize, not rewrite
• Clean codebase (20 python modules)
• Aware of django.contrib.admin, django.form, etc.
• Lack of ORM functionality
✓ I don’t like to write raw SQL✓ I need composite keys✓ I want to optimize for a DB backend (we are
on PostgreSQL)
Saturday, June 2, 12
![Page 5: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/5.jpg)
Why Flask? as����������� ������������������ we����������� ������������������ already����������� ������������������ have����������� ������������������ tones����������� ������������������ of����������� ������������������ stuff
Because we can
Saturday, June 2, 12
![Page 6: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/6.jpg)
Validation resource����������� ������������������ tier,����������� ������������������ model����������� ������������������ tier
Trafaret http://pypi.python.org/pypi/trafaret
import trafaret as t
t.Dict({'first_name': t.String, 'last_name': t.String, 'phone': t.String, t.Key('role_id', optional=True): t.Int}).ignore_extra('*')
Saturday, June 2, 12
![Page 7: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/7.jpg)
Validation resource����������� ������������������ tier,����������� ������������������ model����������� ������������������ tier
Key subset:
t.Dict({'first_name': t.String, te.KeysSubset('pass', 'confirm'): cmp_pwds})
def cmp_pwds(value): if value['pass'] != value['confirm']: return {'confirm': t.DataError("Doesn't match")} return {'pass': value['pass']}
Saturday, June 2, 12
![Page 8: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/8.jpg)
Validation resource����������� ������������������ tier,����������� ������������������ model����������� ������������������ tier
Type check:• Null, Bool, String, Int, Float, List, Dict
• Atom, Email, URL, Enum, Callable
• Converters, ignorance, excludes, optional keys
@guard(a=String, b=Int, c=String)def guarded(a, b, c): return a, b, c
Saturday, June 2, 12
![Page 9: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/9.jpg)
Achievements yes,����������� ������������������ we����������� ������������������ didBased on Flask’s MethodView
Extended with method-decorators
Simple to attach
Resource — for generic cases
ModelResource — SQLA mapped classes
Saturday, June 2, 12
![Page 10: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/10.jpg)
Achievements yes,����������� ������������������ we����������� ������������������ did
Inspired by• django-tastypie
• flask-restless
• rainbows and unicorns
Saturday, June 2, 12
![Page 11: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/11.jpg)
Achievements yes,����������� ������������������ we����������� ������������������ did
In Practice@api_resource(account, 'sessions', {'id': None})class SessionResource(Resource): validation = t.Dict({'email': t.Email}).allow_extra('*')
@api_resource(account, 'addresses', {'id': int})class AddressResource(ModelResource):
validation = t.Dict({'city': t.String, 'street': t.String, 'type': t.String(regex="(bill|delivery)")} ).allow_extra('*') model = Address def get_objects(self): ... def get_object(self): ...
Saturday, June 2, 12
![Page 12: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/12.jpg)
Achievements yes,����������� ������������������ we����������� ������������������ did
Differences
@api_resource(account, 'profiles', {'id': None})class RoleResource(ModelResource): validation = ...
decorators = [login_required, ]
method_decorators = {'post': check_permission('is_superuser'), 'put': check_permission('is_superuser')}
Saturday, June 2, 12
![Page 13: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/13.jpg)
Roadmap no,����������� ������������������ we����������� ������������������ don’t
To be done• Filtering (DSL?)
• Caching
• Throttling
• Customizing field set for ModelResource
Saturday, June 2, 12
![Page 14: Rest in flask](https://reader034.fdocuments.net/reader034/viewer/2022042613/5538a0644a7959c1688b4795/html5/thumbnails/14.jpg)
Questions? write����������� ������������������ code,����������� ������������������ not����������� ������������������ hollywar
Saturday, June 2, 12