From 1646770c4eee27f37e53dcb50f8a271d5c278abf Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Thu, 29 Oct 2009 23:07:48 +0000 Subject: - The ``repoze.bfg.request.Request`` class, which is a subclass of ``webob.Request`` now defines its own ``__setattr__``, ``__getattr__`` and ``__delattr__`` methods, which override the default WebOb behavior. The default WebOb behavior stores attributes of the request in ``self.environ['webob.adhoc_attrs']``, and retrieves them from that dictionary during a ``__getattr__``. This behavior was undesirable for speed and "expectation" reasons. Now attributes of the ``request`` are stored in ``request.__dict__`` (as you otherwise might expect from an object that did not override these methods). - The router no longer calls ``repoze.bfg.traversal._traverse`` and does its work "inline" (speed). --- repoze/bfg/request.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'repoze/bfg/request.py') diff --git a/repoze/bfg/request.py b/repoze/bfg/request.py index 416413c33..e81710ae1 100644 --- a/repoze/bfg/request.py +++ b/repoze/bfg/request.py @@ -19,12 +19,19 @@ class Request(WebobRequest): implements(IRequest) charset = 'utf-8' + # override default WebOb "environ['adhoc_attr']" mutation behavior + __getattr__ = object.__getattribute__ + __setattr__ = object.__setattr__ + __delattr__ = object.__delattr__ + 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) + request = factory(environ) + request.matchdict = environ['bfg.routes.matchdict'] + return request return Request(environ) def create_route_request_factory(name): @@ -34,10 +41,15 @@ def create_route_request_factory(name): implements(iface) charset = 'utf-8' + # override default WebOb "environ['adhoc_attr']" mutation behavior + __getattr__ = object.__getattribute__ + __setattr__ = object.__setattr__ + __delattr__ = object.__delattr__ + return RouteRequest def add_global_response_headers(request, headerlist): - attrs = request.environ.setdefault('webob.adhoc_attrs', {}) + attrs = request.__dict__ response_headers = attrs.setdefault('global_response_headers', []) response_headers.extend(headerlist) -- cgit v1.2.3