Table of Contents
Home > computers > programming > python | pythonmicrowebframeworks | About
CherryPy
- Maturity : 10 years (2015)
- No dependencies
- Hello world
import cherrypy class HelloWorld(object): def index(self): return "Hello World!" index.exposed = True cherrypy.quickstart(HelloWorld())
Extra : works on Android.
Bottle (my favorite so far)
- A single file
- Hello World
from bottle import route, run, template @route('/hello/<name>') def index(name): return template('<b>Hello {{name}}</b>!', name=name) run(host='localhost', port=8080)
Extra: nice routes.
Circuits
- Hello world
from circuits.web import Server, Controller class Root(Controller): def index(self): return "Hello World!" (Server(8000) + Root()).run()
- Very componentized, components are litterally
'added
' to your Server
from circuits.web import Server, Controller class Root(Controller): def index(self): return "Hello World!" (Server(8000) + Logger() + Root()).run()
We have just added a logger and a request handler to our http server
(Server(8000) + Static("/static", docroot="/home/joe/www/") + Root()).run()
We have just added a static route dispatcher to our app to serve static files (js, css, img etc.)
- Easy WSGI integration.
from circuits.web.wsgi import Gateway from circuits.web import Controller, Server def foo(environ, start_response): start_response("200 OK", [("Content-Type", "text/plain")]) return ["Foo!"] class Root(Controller): """App Rot""" def index(self): return "Hello World!" app = Server(("0.0.0.0", 10000)) Root().register(app) Gateway({"/foo": foo}).register(app) app.run()
Extra : Form names map directly to function arguments.
!/usr/bin/env python from circuits.web import Server, Controller class Root(Controller): html = """\ [...] <form action="submit" method="POST"> [...] <td><input type="text" name="firstName"></td> [...] <td><input type="text" name="lastName"></td> [...] </html>""" def submit(self, firstName, lastName): return "Hello %s %s" % (firstName, lastName) (Server(8000) + Root()).run()
Quixote
- URL to python method mapping (routes)
- HTML creation library
- FORM creation and processing library
- A templating language (PTL)
- Weired API
_q_exports = [ "doit1", "doit2", ("externalName", "doit3") ]
URIs are put in first level, then all the methods are put in a tuple. Why not create a list of two tuples for example ?
def _q_index (request):
This is actually the name of a public method that can be rewritten to define the default method to call when no specific mapping exists for a certain URI. Why does it look like a private method ?
Weblayer
- Hello World
from weblayer import Bootstrapper, RequestHandler, WSGIApplication class Hello(RequestHandler): def get(self, world): return u'hello %s' % world mapping = [(r'/(.*)', Hello)] config = { 'cookie_secret': '...', 'static_files_path': '/var/www/static', 'template_directories': ['templates'] } bootstrapper = Bootstrapper(settings=config, url_mapping=mapping) application = WSGIApplication(*bootstrapper()) def main(): from wsgiref.simple_server import make_server make_server('', 8080, application).serve_forever() if __name__ == '__main__': # pragma: no cover main()
contact : @ychaouche yacinechaouche at yahoocom