pyramid rest

Download Pyramid REST

If you can't read please download the document

Upload: lukasz-oles

Post on 16-Apr-2017

3.961 views

Category:

Technology


0 download

TRANSCRIPT

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]