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
|
from zope.component import queryMultiAdapter
from zope.interface import directlyProvides
from webob import Request
from webob.exc import HTTPNotFound
from repoze.bfg.interfaces import IWSGIApplicationFactory
from repoze.bfg.interfaces import IWebObRequest
class Router:
def __init__(self, root_policy, traversal_policy, security_policy):
self.root_policy = root_policy
self.traversal_policy = traversal_policy
self.security_policy = security_policy
def __call__(self, environ, start_response):
root = self.root_policy(environ)
context, name, subpath = self.traversal_policy(environ, root)
app = self.security_policy(environ, context, name)
if app is None:
environ['repoze.bfg.subpath'] = subpath
request = Request(environ)
directlyProvides(request, IWebObRequest)
app = queryMultiAdapter((context, request),
IWSGIApplicationFactory, name=name)
if app is None:
app = HTTPNotFound(request.url)
return app(environ, start_response)
|