summaryrefslogtreecommitdiff
path: root/pyramid/router.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyramid/router.py')
-rw-r--r--pyramid/router.py43
1 files changed, 31 insertions, 12 deletions
diff --git a/pyramid/router.py b/pyramid/router.py
index 8b7b7b6bc..a02ff1715 100644
--- a/pyramid/router.py
+++ b/pyramid/router.py
@@ -1,3 +1,4 @@
+import sys
from zope.interface import (
implementer,
providedBy,
@@ -24,6 +25,7 @@ from pyramid.events import (
BeforeTraversal,
)
+from pyramid.compat import reraise
from pyramid.httpexceptions import HTTPNotFound
from pyramid.request import Request
from pyramid.view import _call_view
@@ -190,13 +192,21 @@ class Router(object):
"""
request.registry = self.registry
request.invoke_subrequest = self.invoke_subrequest
- return self.invoke_request(
- request,
- _use_tweens=use_tweens,
- _apply_extensions=True,
- )
+ extensions = self.request_extensions
+ if extensions is not None:
+ apply_request_extensions(request, extensions=extensions)
+ return self.invoke_request(request, _use_tweens=use_tweens)
def make_request(self, environ):
+ """
+ Configure a request object for use by the router.
+
+ The request is created using the configured
+ :class:`pyramid.interfaces.IRequestFactory` and will have any
+ configured request methods / properties added that were set by
+ :meth:`pyramid.config.Configurator.add_request_method`.
+
+ """
request = self.request_factory(environ)
request.registry = self.registry
request.invoke_subrequest = self.invoke_subrequest
@@ -205,8 +215,12 @@ class Router(object):
apply_request_extensions(request, extensions=extensions)
return request
- def invoke_request(self, request,
- _use_tweens=True, _apply_extensions=False):
+ def invoke_request(self, request, _use_tweens=True):
+ """
+ Execute a request through the request processing pipeline and
+ return the generated response.
+
+ """
registry = self.registry
has_listeners = self.registry.has_listeners
notify = self.registry.notify
@@ -222,9 +236,6 @@ class Router(object):
try:
try:
- extensions = self.request_extensions
- if _apply_extensions and extensions is not None:
- apply_request_extensions(request, extensions=extensions)
response = handle_request(request)
if request.response_callbacks:
@@ -252,7 +263,15 @@ class Router(object):
response = self.execution_policy(environ, self)
return response(environ, start_response)
-
def default_execution_policy(environ, router):
request = router.make_request(environ)
- return router.invoke_request(request)
+ try:
+ return router.invoke_request(request)
+ except Exception:
+ exc_info = sys.exc_info()
+ try:
+ return request.invoke_exception_view(exc_info)
+ except HTTPNotFound:
+ reraise(*exc_info)
+ finally:
+ del exc_info # avoid local ref cycle