From e5cf7dbec2ccda7d2e4d79815ac441acf2ab1061 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sun, 25 Jan 2009 03:33:08 +0000 Subject: Do an end-run around webob.Request.__setitem__ until it gets sped up. --- repoze/bfg/router.py | 21 ++++++++++++++++----- repoze/bfg/tests/test_router.py | 14 ++++++++------ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index c7c38e1d1..bc4a8cf7b 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -1,4 +1,5 @@ import sys +from webob import Request as WebObRequest from zope.component.event import dispatch @@ -100,11 +101,21 @@ class Router(object): traverser = registry.getAdapter(root, ITraverserFactory) context, view_name, subpath = traverser(environ) - # XXX webob.Request's __setattr__ is slow here: investigate. - request.root = root - request.context = context - request.view_name = view_name - request.subpath = subpath + if isinstance(request, WebObRequest): + # webob.Request's __setattr__ (as of 0.9.5 and lower) + # is a bottleneck; if we're sure we're using a + # webob.Request, go around its back and set stuff into + # the environ directly + attrs = environ.setdefault('webob.adhoc_attrs', {}) + attrs['root'] = root + attrs['context'] = context + attrs['view_name'] = view_name + attrs['subpath'] = subpath + else: + request.root = root + request.context = context + request.view_name = view_name + request.subpath = subpath security_policy = self.security_policy diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index 99f982371..29849e396 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -541,10 +541,8 @@ class RouterTests(unittest.TestCase): def test_call_irequestfactory_override(self): from repoze.bfg.interfaces import INewRequest from repoze.bfg.interfaces import IRequestFactory - from webob import Request - class Request2(Request): - pass - self.registry.registerUtility(Request2, IRequestFactory) + from repoze.bfg.testing import DummyRequest + self.registry.registerUtility(DummyRequest, IRequestFactory) rootfactory = make_rootfactory(None) context = DummyContext() traversalfactory = make_traversal_factory(context, '', []) @@ -560,7 +558,11 @@ class RouterTests(unittest.TestCase): request_events = self._registerEventListener(INewRequest) result = router(environ, start_response) request = request_events[0].request - self.failUnless(isinstance(request, Request2)) + self.failUnless(isinstance(request, DummyRequest)) + self.assertEqual(request.root, None) + self.assertEqual(request.context, context) + self.assertEqual(request.view_name, '') + self.assertEqual(request.subpath, []) def test_call_inotfound_appfactory_override(self): from repoze.bfg.interfaces import INotFoundAppFactory @@ -597,7 +599,7 @@ class RouterTests(unittest.TestCase): self._registerRootFactory(rootfactory) router = self._makeOne() self.assertEqual(router.unauth_app_factory, app) - + class MakeAppTests(unittest.TestCase): def setUp(self): cleanUp() -- cgit v1.2.3