Created
March 2, 2012 19:15
-
-
Save patricklucas/1960532 to your computer and use it in GitHub Desktop.
Mini framework v2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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