diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-09-06 03:36:59 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-09-06 03:36:59 +0000 |
| commit | d66bfb5d1f1aef5cce4941b49740dbd136c95605 (patch) | |
| tree | 0204e233befdb8ad99332e498308468015f3558e /repoze/bfg/request.py | |
| parent | 50df953770409dc9c9558c77bd5c0bbb17ac54f6 (diff) | |
| download | pyramid-d66bfb5d1f1aef5cce4941b49740dbd136c95605.tar.gz pyramid-d66bfb5d1f1aef5cce4941b49740dbd136c95605.tar.bz2 pyramid-d66bfb5d1f1aef5cce4941b49740dbd136c95605.zip | |
Merge multiview2 branch to HEAD.
Diffstat (limited to 'repoze/bfg/request.py')
| -rw-r--r-- | repoze/bfg/request.py | 113 |
1 files changed, 21 insertions, 92 deletions
diff --git a/repoze/bfg/request.py b/repoze/bfg/request.py index 932789e0a..9b29d3e1f 100644 --- a/repoze/bfg/request.py +++ b/repoze/bfg/request.py @@ -1,36 +1,14 @@ -from zope.component import getUtility from zope.interface import implements -from webob import Request as WebobRequest - -from zope.deprecation import deprecated from zope.interface.interface import InterfaceClass -from repoze.bfg.interfaces import IRequest -from repoze.bfg.interfaces import IGETRequest -from repoze.bfg.interfaces import IPOSTRequest -from repoze.bfg.interfaces import IPUTRequest -from repoze.bfg.interfaces import IDELETERequest -from repoze.bfg.interfaces import IHEADRequest -from repoze.bfg.interfaces import IRequestFactories +from zope.component import queryUtility -def request_factory(environ): - try: - method = environ['REQUEST_METHOD'] - except KeyError: - method = None - - if 'bfg.routes.route' in environ: - route = environ['bfg.routes.route'] - request_factories = getUtility(IRequestFactories, name=route.name or '') - else: - request_factories = DEFAULT_REQUEST_FACTORIES +from webob import Request as WebobRequest - try: - request_factory = request_factories[method]['factory'] - except KeyError: - request_factory = request_factories[None]['factory'] +from zope.deprecation import deprecated - return request_factory(environ) +from repoze.bfg.interfaces import IRequest +from repoze.bfg.interfaces import IRouteRequest def make_request_ascii(event): """ An event handler that causes the request charset to be ASCII; @@ -39,75 +17,26 @@ def make_request_ascii(event): request = event.request request.charset = None -def named_request_factories(name=None): - # We use 'precooked' Request subclasses that correspond to HTTP - # request methods when returning a request object from - # ``request_factory`` rather than using ``alsoProvides`` to attach - # the proper interface to an unsubclassed webob.Request. This - # pattern is purely an optimization (e.g. preventing calls to - # ``alsoProvides`` means the difference between 590 r/s and 690 - # r/s on a MacBook 2GHz). This method should be never imported - # directly by user code; it is *not* an API. - if name is None: - default_iface = IRequest - get_iface = IGETRequest - post_iface = IPOSTRequest - put_iface = IPUTRequest - delete_iface = IDELETERequest - head_iface = IHEADRequest - else: - IC = InterfaceClass - default_iface = IC('%s_IRequest' % name, (IRequest,)) - get_iface = IC('%s_IGETRequest' % name, (default_iface, IGETRequest)) - post_iface = IC('%s_IPOSTRequest' % name, (default_iface, IPOSTRequest)) - put_iface = IC('%s_IPUTRequest' % name, (default_iface, IPUTRequest)) - delete_iface = IC('%s_IDELETERequest' % name, (default_iface, - IDELETERequest)) - head_iface = IC('%s_IHEADRequest' % name, (default_iface, - IHEADRequest,)) - - class Request(WebobRequest): - implements(default_iface) - charset = 'utf-8' +class Request(WebobRequest): + implements(IRequest) + charset = 'utf-8' - class GETRequest(WebobRequest): - implements(get_iface) - charset = 'utf-8' - - class POSTRequest(WebobRequest): - implements(post_iface) - charset = 'utf-8' - - class PUTRequest(WebobRequest): - implements(put_iface) - charset = 'utf-8' - - class DELETERequest(WebobRequest): - implements(delete_iface) - charset = 'utf-8' +def request_factory(environ): + if 'bfg.routes.route' in environ: + route = environ['bfg.routes.route'] + factory = queryUtility(IRouteRequest, name=route.name) + if factory is not None: + return factory(environ) + return Request(environ) - class HEADRequest(WebobRequest): - implements(head_iface) +def create_route_request_factory(name): + iface = InterfaceClass('%s_IRequest' % name, (IRouteRequest,)) + + class RouteRequest(WebobRequest): + implements(iface) charset = 'utf-8' - factories = { - IRequest:{'interface':default_iface, 'factory':Request}, - IGETRequest:{'interface':get_iface, 'factory':GETRequest}, - IPOSTRequest:{'interface':post_iface, 'factory':POSTRequest}, - IPUTRequest:{'interface':put_iface, 'factory':PUTRequest}, - IDELETERequest:{'interface':delete_iface, 'factory':DELETERequest}, - IHEADRequest:{'interface':head_iface, 'factory':HEADRequest}, - None:{'interface':default_iface, 'factory':Request}, - 'GET':{'interface':get_iface, 'factory':GETRequest}, - 'POST':{'interface':post_iface, 'factory':POSTRequest}, - 'PUT':{'interface':put_iface, 'factory':PUTRequest}, - 'DELETE':{'interface':delete_iface, 'factory':DELETERequest}, - 'HEAD':{'interface':head_iface, 'factory':HEADRequest}, - } - - return factories - -DEFAULT_REQUEST_FACTORIES = named_request_factories() + return RouteRequest from repoze.bfg.threadlocal import get_current_request as get_request # b/c |
