awips2/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/application.py
2017-04-21 18:33:55 -06:00

86 lines
2.7 KiB
Python

from os import path
from werkzeug.templates import Template
from werkzeug.wrappers import BaseRequest, BaseResponse
from werkzeug.routing import NotFound, RequestRedirect
from werkzeug.exceptions import HTTPException, NotFound
from i18nurls.urls import map
TEMPLATES = path.join(path.dirname(__file__), 'templates')
views = {}
def expose(name):
"""Register the function as view."""
def wrapped(f):
views[name] = f
return f
return wrapped
class Request(BaseRequest):
def __init__(self, environ, urls):
super(Request, self).__init__(environ)
self.urls = urls
self.matched_url = None
def url_for(self, endpoint, **args):
if not 'lang_code' in args:
args['lang_code'] = self.language
if endpoint == 'this':
endpoint = self.matched_url[0]
tmp = self.matched_url[1].copy()
tmp.update(args)
args = tmp
return self.urls.build(endpoint, args)
class Response(BaseResponse):
pass
class TemplateResponse(Response):
def __init__(self, template_name, **values):
self.template_name = template_name
self.template_values = values
Response.__init__(self, mimetype='text/html')
def __call__(self, environ, start_response):
req = environ['werkzeug.request']
values = self.template_values.copy()
values['req'] = req
values['body'] = self.render_template(self.template_name, values)
self.write(self.render_template('layout.html', values))
return Response.__call__(self, environ, start_response)
def render_template(self, name, values):
return Template.from_file(path.join(TEMPLATES, name)).render(values)
class Application(object):
def __init__(self):
from i18nurls import views
self.not_found = views.page_not_found
def __call__(self, environ, start_response):
urls = map.bind_to_environ(environ)
req = Request(environ, urls)
try:
endpoint, args = urls.match(req.path)
req.matched_url = (endpoint, args)
if endpoint == '#language_select':
lng = req.accept_languages.best
lng = lng and lng.split('-')[0].lower() or 'en'
index_url = urls.build('index', {'lang_code': lng})
resp = Response('Moved to %s' % index_url, status=302)
resp.headers['Location'] = index_url
else:
req.language = args.pop('lang_code', None)
resp = views[endpoint](req, **args)
except NotFound:
resp = self.not_found(req)
except (RequestRedirect, HTTPException), e:
resp = e
return resp(environ, start_response)