summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-01-25 03:33:08 +0000
committerChris McDonough <chrism@agendaless.com>2009-01-25 03:33:08 +0000
commite5cf7dbec2ccda7d2e4d79815ac441acf2ab1061 (patch)
tree789899cd0c8f1e9075ee71145375fd9a2d6fcdd1
parentde49699ef9eeccc6339f29d2e197d6f26d4904dc (diff)
downloadpyramid-e5cf7dbec2ccda7d2e4d79815ac441acf2ab1061.tar.gz
pyramid-e5cf7dbec2ccda7d2e4d79815ac441acf2ab1061.tar.bz2
pyramid-e5cf7dbec2ccda7d2e4d79815ac441acf2ab1061.zip
Do an end-run around webob.Request.__setitem__ until it gets sped up.
-rw-r--r--repoze/bfg/router.py21
-rw-r--r--repoze/bfg/tests/test_router.py14
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()