diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-20 19:55:54 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-20 19:55:54 +0000 |
| commit | eca67ac2005bcac3b8d14d051e5e800ea36f42a8 (patch) | |
| tree | 0dcac61810cba831bd1d484478781cd76ca2e09f | |
| parent | 32634a8734321d0c61892dd6fd90451d380cf6f9 (diff) | |
| download | pyramid-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.py | 15 | ||||
| -rw-r--r-- | repoze/bfg/request.py | 38 | ||||
| -rw-r--r-- | repoze/bfg/router.py | 18 |
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) |
