If you can't read please download the document
Upload
lukasz-oles
View
3.962
Download
0
Embed Size (px)
Citation preview
REST w Pyramidzie
ukasz Ole
ProstotaMinimalizmDokumentacjaSzybkoStabilno
Dziaa na:
Python 2.6 3.3
PyPy
Jython
GAE
REST
http://autouzupelnij.pl
GET http://api.autouzupelnij.pl/v1/public/city?term=gli
REST
()/public/city?term=gli
Nazwa konta
()/public/city?term=gli
REST
()/public/city?term=gli
Nazwa konta
Kontener
REST
()/public/city?term=gli
Nazwa konta
Zapytanie
Kontener
Nowy projekt
pcreate -t starter api
\api development.ini setup.py \api __init__.py views.py
Plik api/__init__.py
from pyramid.config import Configurator
def main(global_config, **settings): config = Configurator(settings=settings) config.add_route('completion', '/v1/{account}/{container}') config.scan() return config.make_wsgi_app()
pserve development.ini
Plik api/views.py
from pyramid.view import view_config
@view_config(route_name='completion', renderer='json', request_method='GET')def completion(request): account = request.matchdict['account'] container = request.matchdict['container'] query = request.params.get('term', u'') storage = get_storage(account) offers = storage.suggest(container, query)) return offers
Plik api/views.py
@view_config(route_name='completion', renderer='json', request_method='DELETE', permission='edit')def delete_container(request): container = request.matchdict['container'] account = request.matchdict['account'] storage = get_storage( account) storage.delete_container(container)
Nowy element
Plik api/__init__.py
config.add_route('items', '/v1/{account}/{container}/{item}')
Plik api/views.py
@view_config(route_name='items', renderer='json', request_method='PUT', permission='edit')def add_item(request): container = request.matchdict['container'] account = request.matchdict['account'] item = request.matchdict['item']
storage = get_storage(account) storage.store_item(container, item)
Walidacja - dodatkowe dane
{population : 20000,province : slaskie}
Colander
http://docs.pylonsproject.org/projects/colander
from colander import MappingSchema, SchemaNode, Int, String
class City(MappingSchema): province = SchemaNode(String()) population = SchemaNode(Int())
Plik api/views.py
@view_config(route_name='items', renderer='json', request_method='PUT', permission='edit')def add_item(request): container = request.matchdict['container'] account = request.matchdict['account'] item = request.matchdict['item']
city = City() data = city.deserialize(request.json_body) storage = get_storage(account) storage.store_item(container, item, data)
@view_config(context=colander.Invalid)def failed_valdation(exc, request): err = json.dumps(exc.asdict()) return HTTPBadRequest(err)
Autoryzacja
http://docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/wiki2/authorization.html
https://ziggurat-foundations.readthedocs.org
Plik api/__init__.py
from api.auth import RootFactory, auth_check def main(global_config, **settings): config = Configurator(settings=settings, root_factory=RootFactory, authentication_policy= AuthenticationPolicy(auth_check))
COSR poziom zaawansowany
JavaScript Ajaxhttp://autouzupelnij.pl -> http://api.autouzupelnij.pl
http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
Access-Control-Allow-Origin: http://autouzupelnij.plAccess-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GETAccess-Control-Allow-Headers: Content-Type
COSR poziom zaawansowany
Plik api/__init__.py
from pyramid.events import subscriber, NewResponse
@subscriber(NewResponse)def add_access_list(event): event.response.headerlist.append(('Access-Control-Allow-Origin', '*'))
COSR poziom zaawansowany
Co dalej?
Cornicehttp://cornice.readthedocs.org/
Pytania
ukasz [email protected]
Dzikuj
ukasz [email protected]