summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-01-20 19:55:54 +0000
committerChris McDonough <chrism@agendaless.com>2009-01-20 19:55:54 +0000
commiteca67ac2005bcac3b8d14d051e5e800ea36f42a8 (patch)
tree0dcac61810cba831bd1d484478781cd76ca2e09f
parent32634a8734321d0c61892dd6fd90451d380cf6f9 (diff)
downloadpyramid-eca67ac2005bcac3b8d14d051e5e800ea36f42a8.tar.gz
pyramid-eca67ac2005bcac3b8d14d051e5e800ea36f42a8.tar.bz2
pyramid-eca67ac2005bcac3b8d14d051e5e800ea36f42a8.zip
# We use 'precooked' Request subclasses that correspond to HTTP
# request methods within ``router.py`` when constructing a request # object 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).
-rw-r--r--repoze/bfg/interfaces.py15
-rw-r--r--repoze/bfg/request.py38
-rw-r--r--repoze/bfg/router.py18
3 files changed, 51 insertions, 20 deletions
diff --git a/repoze/bfg/interfaces.py b/repoze/bfg/interfaces.py
index 567fb6d33..58a0e3257 100644
--- a/repoze/bfg/interfaces.py
+++ b/repoze/bfg/interfaces.py
@@ -1,9 +1,14 @@
-from zope.interface import Interface
from zope.interface import Attribute
+from zope.interface import Interface
+from zope.interface import implements
+
from zope.deferredimport import deprecated
from zope.component.interfaces import IObjectEvent
+from webob import Request as WebobRequest
+
+
deprecated(
'(repoze.bfg.interfaces.ITemplate should now be imported '
'as repoze.bfg.interfaces.ITemplateRenderer)',
@@ -179,14 +184,6 @@ class ILocation(Interface):
class ILogger(Interface):
""" Interface representing a PEP 282 logger """
-HTTP_METHOD_INTERFACES = {
- 'GET':IGETRequest,
- 'POST':IPOSTRequest,
- 'PUT':IPUTRequest,
- 'DELETE':IDELETERequest,
- 'HEAD':IHEADRequest,
- }
-
class IRoutesMapper(Interface):
""" Interface representing a Routes ``Mapper`` object """
diff --git a/repoze/bfg/request.py b/repoze/bfg/request.py
new file mode 100644
index 000000000..c764a2e9b
--- /dev/null
+++ b/repoze/bfg/request.py
@@ -0,0 +1,38 @@
+from zope.interface import implements
+from webob import Request as WebobRequest
+
+import repoze.bfg.interfaces
+
+# We use 'precooked' Request subclasses that correspond to HTTP
+# request methods within ``router.py`` when constructing a request
+# object 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).
+
+class Request(WebobRequest):
+ implements(repoze.bfg.interfaces.IRequest)
+
+class GETRequest(WebobRequest):
+ implements(repoze.bfg.interfaces.IGETRequest)
+
+class POSTRequest(WebobRequest):
+ implements(repoze.bfg.interfaces.IPOSTRequest)
+
+class PUTRequest(WebobRequest):
+ implements(repoze.bfg.interfaces.IPUTRequest)
+
+class DELETERequest(WebobRequest):
+ implements(repoze.bfg.interfaces.IDELETERequest)
+
+class HEADRequest(WebobRequest):
+ implements(repoze.bfg.interfaces.IHEADRequest)
+
+HTTP_METHOD_FACTORIES = {
+ 'GET':GETRequest,
+ 'POST':POSTRequest,
+ 'PUT':PUTRequest,
+ 'DELETE':DELETERequest,
+ 'HEAD':HEADRequest,
+ }
+
diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py
index 849b40d7e..6630d0a0a 100644
--- a/repoze/bfg/router.py
+++ b/repoze/bfg/router.py
@@ -7,10 +7,8 @@ from zope.component import queryUtility
from zope.component.event import dispatch
from zope.component.registry import Components
-from zope.interface import alsoProvides
from zope.interface import implements
-from webob import Request
from webob.exc import HTTPNotFound
from webob.exc import HTTPUnauthorized
@@ -20,11 +18,8 @@ from repoze.bfg.events import WSGIApplicationCreatedEvent
from repoze.bfg.interfaces import ILogger
from repoze.bfg.interfaces import ITraverserFactory
-from repoze.bfg.interfaces import IRequest
from repoze.bfg.interfaces import IRequestFactory
from repoze.bfg.interfaces import IRoutesMapper
-from repoze.bfg.interfaces import HTTP_METHOD_INTERFACES
-
from repoze.bfg.interfaces import IRouter
from repoze.bfg.interfaces import IRootFactory
from repoze.bfg.interfaces import ISettings
@@ -33,6 +28,8 @@ from repoze.bfg.log import make_stream_logger
from repoze.bfg.registry import registry_manager
from repoze.bfg.registry import populateRegistry
+from repoze.bfg.request import HTTP_METHOD_FACTORIES
+from repoze.bfg.request import Request
from repoze.bfg.settings import Settings
from repoze.bfg.urldispatch import RoutesRootFactory
@@ -63,14 +60,13 @@ class Router(object):
registry_manager.push(self.registry)
try:
- request_factory = queryUtility(IRequestFactory, default=Request)
+
+ request_factory = queryUtility(IRequestFactory)
+ if request_factory is None:
+ method = environ.get('REQUEST_METHOD', 'GET')
+ request_factory = HTTP_METHOD_FACTORIES.get(method, Request)
request = request_factory(environ)
- alsoProvides(request, IRequest)
- also_http = HTTP_METHOD_INTERFACES.get(request.method)
- if also_http is not None:
- alsoProvides(request, also_http)
-
dispatch(NewRequest(request))
root_factory = getUtility(IRootFactory)
root = root_factory(environ)