Grimper en haut de la Pyramid

Gaston Tjebbes

gaston@majerti.fr

_images/pyramid_guat.png

Le choix du framework

Une problématique métier

_images/pb_ideal.png

Une problématique métier

_images/pb_reel.png

Une problématique contextuelle

_images/contexte_ideal.png

Une problématique contextuelle

_images/contexte_reel.png

Un (des) problème(s)

_images/problem.png

"Une" solution

_images/solution.png

Mais ... finalement

_images/hammer.png

Mais ... finalement

_images/problem_soluce1.png
_images/pyramid.png
_images/problem_soluce2.png

Le premier pas

$ 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 !!!

_images/kiss.png

Le premier pas

$ 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

Le minimum nécessaire

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'}

Le view lookup

@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/

Les vues, des objets Python

Ce sont :

Une seule contrainte dans les cas (2) et (3) :

def __init__(self, request):
    self.my_request_object = request

Extensible

Un moteur de templating ? Nous vous proposons :

pip install pyramid_mako
config.include('pyramid_mako')
@view_config(route_name='home', renderer='templates/home.mako')

Extensible

vont permettre de créer facilement des extensions.

Framework sans opinion

_images/nspp.png

Framework sans opinion

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.

URL Dispatch

_images/dispatch.png

URL Traversal

_images/traversal.png

URL Traversal : l'arbre

_images/tree.png

URL Traversal : l'arbre

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)

URL Traversal : les vues

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"}}

Authentification/Acls

Deux modules :

ACLAuthorizationPolicy

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')

Autres

Quelques références

...

_images/pyramid_top.png

Merci

Le lien vers la conf : https://github.com/majerteam/pyconfr_pyramid