rest in flask

14
REST in Flask raising the service I am: Yehor Nazarkin Follow me: @nimnull Email me: [email protected] Saturday, June 2, 12

Upload: yehor-nazarkin

Post on 22-Apr-2015

4.247 views

Category:

Technology


0 download

DESCRIPTION

My way to build RESTful solution with python and flask

TRANSCRIPT

Page 1: Rest in flask

REST in Flaskraising����������� ������������������  the����������� ������������������  service

I am: Yehor NazarkinFollow me: @nimnullEmail me: [email protected]

Saturday, June 2, 12

Page 2: Rest in flask

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

RESTin����������� ������������������  pieces

Backends

Web Front Mobile client

API

Saturday, June 2, 12

Page 4: Rest in flask

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

Why Flask? as����������� ������������������  we����������� ������������������  already����������� ������������������  have����������� ������������������  tones����������� ������������������  of����������� ������������������  stuff

Because we can

Saturday, June 2, 12

Page 6: Rest in flask

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

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

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

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

Achievements yes,����������� ������������������  we����������� ������������������  did

Inspired by• django-tastypie

• flask-restless

• rainbows and unicorns

Saturday, June 2, 12

Page 11: Rest in flask

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

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

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

Questions? write����������� ������������������  code,����������� ������������������  not����������� ������������������  hollywar

Saturday, June 2, 12