Skip to content

Instantly share code, notes, and snippets.

@patricklucas
Created March 2, 2012 19:15
Show Gist options
  • Save patricklucas/1960532 to your computer and use it in GitHub Desktop.
Save patricklucas/1960532 to your computer and use it in GitHub Desktop.
Mini framework v2
import re
import webob
import webob.exc
class Servlet(object):
name = None
def __init__(self, request, response):
super(Servlet, self).__init__()
self.request = request
self.response = response
def routes(self):
raise NotImplementedError
def __call__(self):
for method, path, action in self.routes():
if method != self.request.method:
continue
matches = re.match('^' + path + '/?$', self.request.path_info[1:])
if matches:
return action(**matches.groupdict())
raise webob.exc.HTTPNotFound
class Apper(object):
def __init__(self, *servlets):
super(Apper, self).__init__()
self.servlets = {}
for servlet in servlets:
assert servlet.name not in self.servlets
self.servlets[servlet.name] = servlet
def __call__(self, environ, start_response):
request = webob.Request(environ)
response = webob.Response(request=request)
servlet_name = request.path_info_pop()
try:
if servlet_name not in self.servlets:
raise webob.exc.HTTPNotFound
servlet = self.servlets[servlet_name](request, response)
retval = servlet()
if isinstance(retval, basestring):
response.body = retval
else:
response.app_iter = retval
except webob.exc.WSGIHTTPException as e:
return request.get_response(e)(environ, start_response)
else:
return response(environ, start_response)
import simplejson
from wsgiref.simple_server import make_server
import webob.exc
from apper import Apper, Servlet
class Home(Servlet):
name = ""
def routes(self):
return [
('GET', r"", self.home)
]
def home(self):
return """
<h1>Welcome!</h1>
<form action="/hello" method="post">
Name: <input type="text" name="name" />
<input type="submit" value="Go!" />
</form>
"""
class Hello(Servlet):
name = "hello"
def routes(self):
return [
('GET', r"(?P<name>.+)", self.hello),
('POST', r"", self.hello_post)
]
def hello(self, name):
return "Hello, %s!" % name
def hello_post(self):
if not self.request.POST.get('name'):
raise webob.exc.HTTPNotFound
name = self.request.POST['name']
raise webob.exc.HTTPSeeOther(location="/hello/%s" % name)
app = Apper(Home, Hello)
make_server('0.0.0.0', 8000, app).serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment