Grimper en haut de la Pyramid
Gaston Tjebbes
Gaston Tjebbes
$ mkvirtualenv pyramid_test
$ pip install pyramid
$ pcreate -s starter myproject
$ cd myproject
$ python setup.py develop
$ pserve development.ini
Starting server in PID 3248.
serving on http://0.0.0.0:6543
Eh mais en fait, c'est du Python !!!
$ tree
├── CHANGES.txt
├── development.ini
├── MANIFEST.in
├── myproject
│ ├── __init__.py
│ ├── static
│ │ ├── pyramid-16x16.png
│ │ ├── pyramid.png
│ │ ├── theme.css
│ │ └── theme.min.css
│ ├── templates
│ │ └── mytemplate.pt
│ ├── tests.py
│ ├── views.py
├── production.ini
├── README.txt
└── setup.py
Request → Code → Response
def main(global_config, **settings):
config = Configurator(settings=settings)
config.include('pyramid_chameleon')
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('home', '/')
config.scan()
return config.make_wsgi_app()
@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
return {'project': 'myproject'}
@view_config(route_name='home', renderer='json', xhr=True)
@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
return {'project': 'myproject'}
$ wget -q -O - "$@" http://127.0.0.1:6543/
$ wget --header="X-Requested-With:XMLHttpRequest" -q -O - "$@" \
http://127.0.0.1:6543/
Ce sont :
Une seule contrainte dans les cas (2) et (3) :
def __init__(self, request):
self.my_request_object = request
Un moteur de templating ? Nous vous proposons :
pip install pyramid_mako
config.include('pyramid_mako')
@view_config(route_name='home', renderer='templates/home.mako')
vont permettre de créer facilement des extensions.
Pyramid tente de vous laisser libre :
Ce qui vous rend autonome dans vos choix, et permet d'adapter votre outil à votre besoin, et pas l'inverse. Cependant, ces nombreuses possibilités peuvent être un frein, surtout pour un débutant.
Une directive de configuration pour définir la racine de l'arbre.
class User(dict):
pass
class UserQueryFactory(object):
def __getitem__(self, id):
return User(
id=id,
name=u"Fraîchement récupéré dans la base de données"
)
class MyRootFactory(dict):
def __init__(self, request):
self.request = request
self['users'] = UserQueryFactory()
config.set_root_factory(MyRootFactory)
Les vues sont désormais rattachées à un type de contexte et éventuellement à un nom.
def json_view(context, request):
return {'user': context}
config.add_view(json_view, context=User, name='json',
renderer='json')
$ wget -q -O - "$@" http://127.0.0.1:8080/users/15/json/dontcare
{"user": {"name": "Fraichement récupéré dans la base de données", "id":
"15"}}
Deux modules :
Combiné au traversal, permet une gestion dynamique des permissions
class User(dict):
def __acl__(self):
acls = [
(Allow, "group:admin", ALL_PERMISSIONS,),
]
acls.append((Allow, Authenticated, ('edit')))
acls.append((Allow, self['name'], ('view')))
return acls
config.add_view(edit_user, context=User, name='json',
renderer='json', permission='edit')
...
Le lien vers la conf : https://github.com/majerteam/pyconfr_pyramid