pyramid lighter/faster/better web apps
TRANSCRIPT
Lighter/faster/better web apps
Dylan Jay
CTO PretaWeb.comSyPy.orgtwitter: djay75
From the mind of
Chris McDonoughAs seen in bearded of PyCon 2009 http://www.flickr.com/photos/termie/3392894269/
Pyramid Family Tree
Zope formally Principia(1996-)Zope2 (1998-)BlueBream formally Zope3(2004-)ZTK (2009-) Repoze.bfg (2008 2010)Pylons (2005-2010)Pylons Project (2010-)Pyramid formally repoze.bfg(Dec 2010 -)
TurboGears(2005-)
RoR(2004-)
Django(2005-)
Who uses it
It's still new
Karl Project
Aeterna Water paperless sales system
How to build complex web applications having fun
http://slidesha.re/mH9Lxa
1000 employees
No ORM = easy integrate with Plone
Less Magic. More simple
From the minds on PretaWeb...
PloneFactory
Web installer for the worlds favourite Python CMS
Coming 2011...
Differences...
Non opinionated framework
Component Architecture
Packages (eggs)
Simpler and faster
PyramidDjangoPlone
Not OpinionatedOpinionatedStructured (CMS)
Very SimpleSimpleComplex
No DBORMContent Types
Little ReuseSome ReuseEasy Reuse
Performance
http://blog.curiasolutions.com/the-great-web-framework-shootout/
Performance
http://plope.com/pyroptimization
Install
$ virtualenv \ --no-site-packages \ --distribute \ newproject $ cd newproject $ bin/pip install pyramid
Hello World
from paste.httpserver import serve from pyramid.configuration import Configurator from pyramid.response import Response
def hello_world(context, request): return Response('Hello world!')
if __name__ == '__main__': config = Configurator() config.begin() config.add_view(hello_world) config.end() app = config.make_wsgi_app() serve(app, host='0.0.0.0')
config.add_route('myroute', '/prefix/{one}/{two}')config.add_view(hello_world, route_name='myroute')
foo/{baz}/{bar}*fizzlefoo/{baz}/{bar}{fizzle:.*}
Also custom predicates
Routes (URL Dispatch)
View Callables
from pyramid.response import Responsedef hello_world(request): return Response('Hello world!')
from pyramid.httpexceptions import HTTPFoundclass MyView(object): def __init__(self, request): self.request = request
def __call__(self): raise HTTPFound(location='http://example.com')
Request
/prefix/foo/bar?pref=red&pref=blue; def hello_world(request): assert 'blue' == request.params['pref'] assert ['red,'blue] == request.params.getall('pref') assert ['foo','bar'] == request.matchdict.values() return Response('Hello world!')
Renderers
from pyramid.view import view_config
@view_config(renderer='json')def hello_world(request): return {'content':'Hello!'}
@view_config(renderer='string')def hello_world(request): return {'content':'Hello!'}
@view_config(renderer='mypackage:templates/foo.mak')
Add your own - config.add_renderer('.jinja2', 'mypackage.MyJinja2Renderer')
Templates
from pyramid.renderers import render_to_response
def sample_view(request): return render_to_response('templates/foo.pt', {'foo':1, 'bar':2}, request=request)
Templates
from pyramid.renderers import render_to_response
def sample_view(request): return render_to_response('templates/foo.pt', {'foo':1, 'bar':2}, request=request)
BYO Templating
from mako.template import Templatefrom pyramid.response import Response
def make_view(request): template = Template(filename='/templates/template.mak') result = template.render(name=request.params['name']) response = Response(result) return response
Chameleon ZPT Templates
Compiled to python really fast
XHTML complaint
.pt files
${project} Application Welcome to ${project}, an application generated by the