forked from playpauseandstop/rororo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
95 lines (79 loc) · 2.59 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import json
import os
import uuid
from jinja2 import Environment, PackageLoader
from routr import GET, POST, route
from routr.utils import inject_args
from routr.exc import NoMatchFound
from routrschema import qs
from schemify import opt
from webob.exc import HTTPException
from webob.request import Request
from webob.response import Response
from wsgiref.simple_server import make_server
def environ():
return dict(os.environ)
def hello():
return 'Hello, world!'
def page(pk):
return 'Page #{}!'.format(int(pk))
def search(query=None):
if not query:
return 'Enter query to search'
return 'Searching {}...'.format(query)
def template_view():
return {'var': uuid.uuid4()}
def show_request(request, path):
return {
'method': request.method,
'path': path,
'headers': dict(request.headers),
}
routes = route(
GET('/', hello, name='hello'),
GET('/environ', environ, name='environ', renderer='json'),
GET('/page/{pk:int}', page, name='page'),
GET('/search', qs(query=opt(str)), search, name='search'),
GET('/template', template_view, name='template', renderer='template.html'),
GET('/request/{path:path}', show_request, renderer='json'),
)
env = Environment(loader=PackageLoader('app', 'templates'))
env.globals['reverse'] = routes.reverse
def application(environ, start_response):
request = Request(environ)
try:
trace = routes(request)
view = trace.target
args, kwargs = trace.args, trace.kwargs
args = inject_args(view, args, request=request)
response = view(*args, **kwargs)
if not isinstance(response, Response):
response = process_renderer(trace, response)
except NoMatchFound, e:
response = e.response
except HTTPException, e:
response = e
return response(environ, start_response)
def process_renderer(trace, data):
""" Extract renderer metadata from ``trace`` and apply specified renderer to
``data``"""
renderer = trace.endpoint.annotations.get('renderer')
if renderer is None:
return Response(data)
elif renderer == 'json':
return Response(json=data)
elif renderer.endswith('.html'):
template = env.get_template(renderer)
return Response(template.render(**data))
else:
raise ValueError('unknown renderer %s' % renderer)
if __name__ == '__main__':
server = make_server(
os.environ.get('HOST', '0.0.0.0'),
int(os.environ.get('PORT', 8080)),
application
)
try:
server.serve_forever()
except KeyboardInterrupt:
print('^C')