Adding a status-based redirect handler
This commit is contained in:
		| @@ -1,8 +1,9 @@ | |||||||
| from paste.urlparser import StaticURLParser |  | ||||||
| from paste.cascade import Cascade | from paste.cascade import Cascade | ||||||
|  | from paste.errordocument import make_errordocument | ||||||
|  | from paste.recursive import RecursiveMiddleware | ||||||
|  | from paste.urlparser import StaticURLParser | ||||||
| from weberror.errormiddleware import ErrorMiddleware | from weberror.errormiddleware import ErrorMiddleware | ||||||
| from weberror.evalexception import EvalException | from weberror.evalexception import EvalException | ||||||
| from paste.recursive import RecursiveMiddleware |  | ||||||
|  |  | ||||||
| from core import Pecan, request, response, override_template, abort, redirect, error_for | from core import Pecan, request, response, override_template, abort, redirect, error_for | ||||||
| from decorators import expose | from decorators import expose | ||||||
| @@ -23,6 +24,7 @@ def make_app(root, static_root=None, debug=False, errorcfg={}, wrap_app=None, ** | |||||||
|         app = EvalException(app, **errorcfg) |         app = EvalException(app, **errorcfg) | ||||||
|     else: |     else: | ||||||
|         app = ErrorMiddleware(app, **errorcfg) |         app = ErrorMiddleware(app, **errorcfg) | ||||||
|  |     app = make_errordocument(app, conf, **conf.app.errors) | ||||||
|     if static_root: |     if static_root: | ||||||
|         app = Cascade([StaticURLParser(static_root), app]) |         app = Cascade([StaticURLParser(static_root), app]) | ||||||
|     return app |     return app | ||||||
|   | |||||||
| @@ -10,7 +10,10 @@ app = { | |||||||
|     'modules' : [], |     'modules' : [], | ||||||
|     'static_root' : 'public',  |     'static_root' : 'public',  | ||||||
|     'template_path' : '', |     'template_path' : '', | ||||||
|     'debug' : False |     'debug' : False, | ||||||
|  |     'errors' : { | ||||||
|  |         '__force_dict__' : True | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| # Custom Configurations must be in Python dictionary format in user config | # Custom Configurations must be in Python dictionary format in user config | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| from pecan import expose, request | from pecan import expose, request | ||||||
| from formencode import Schema, validators as v | from formencode import Schema, validators as v | ||||||
|  | from webob.exc import status_map | ||||||
|  |  | ||||||
|  |  | ||||||
| class SampleForm(Schema): | class SampleForm(Schema): | ||||||
| @@ -15,3 +16,12 @@ class RootController(object): | |||||||
|     @expose('success.html', schema=SampleForm(), error_handler='index') |     @expose('success.html', schema=SampleForm(), error_handler='index') | ||||||
|     def handle_form(self, name, age): |     def handle_form(self, name, age): | ||||||
|         return dict(name=name, age=age) |         return dict(name=name, age=age) | ||||||
|  |      | ||||||
|  |     @expose('error.html') | ||||||
|  |     def error(self, status): | ||||||
|  |         try: | ||||||
|  |             status = int(status) | ||||||
|  |         except ValueError: | ||||||
|  |             status = 0 | ||||||
|  |         message = getattr(status_map.get(status), 'explanation', '') | ||||||
|  |         return dict(status=status, message=message) | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								pecan/templates/project/+package+/templates/error.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								pecan/templates/project/+package+/templates/error.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | <%inherit file="layout.html" /> | ||||||
|  |  | ||||||
|  | ## provide definitions for blocks we want to redefine | ||||||
|  | <%def name="title()"> | ||||||
|  |     Server Error ${status} | ||||||
|  | </%def> | ||||||
|  |  | ||||||
|  | ## now define the body of the template | ||||||
|  |     <header> | ||||||
|  |       <h1>Server Error ${status}</h1> | ||||||
|  |     </header> | ||||||
|  |     <p>${message}</p> | ||||||
| @@ -15,7 +15,11 @@ app = { | |||||||
|     'static_root' : 'public',  |     'static_root' : 'public',  | ||||||
|     'template_path' : '${package}/templates', |     'template_path' : '${package}/templates', | ||||||
|     'reload': True, |     'reload': True, | ||||||
|     'debug' : True  |     'debug' : True, | ||||||
|  |     'errors' : { | ||||||
|  |         '404' : '/error/404', | ||||||
|  |         '__force_dict__' : True | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| # Custom Configurations must be in Python dictionary format:: | # Custom Configurations must be in Python dictionary format:: | ||||||
|   | |||||||
| @@ -1,11 +1,15 @@ | |||||||
| import os | from formencode import Schema, validators | ||||||
|  | from paste.recursive import ForwardRequestException | ||||||
|  | from unittest import TestCase | ||||||
|  | from webtest import TestApp | ||||||
|  |  | ||||||
| from pecan import Pecan, expose, request, response, redirect, abort | from pecan import Pecan, expose, request, response, redirect, abort | ||||||
| from pecan.templating import _builtin_renderers as builtin_renderers | from pecan.templating import _builtin_renderers as builtin_renderers | ||||||
| from webtest import TestApp |  | ||||||
| from formencode import Schema, validators | import os | ||||||
|  |  | ||||||
|  |  | ||||||
| class TestBase(object): | class TestBase(TestCase): | ||||||
|      |      | ||||||
|     def test_simple_app(self):     |     def test_simple_app(self):     | ||||||
|         class RootController(object): |         class RootController(object): | ||||||
| @@ -366,6 +370,10 @@ class TestBase(object): | |||||||
|             def index(self): |             def index(self): | ||||||
|                 redirect('/testing') |                 redirect('/testing') | ||||||
|              |              | ||||||
|  |             @expose() | ||||||
|  |             def internal(self): | ||||||
|  |                 redirect('/testing', internal=True) | ||||||
|  |              | ||||||
|             @expose() |             @expose() | ||||||
|             def permanent(self): |             def permanent(self): | ||||||
|                 redirect('/testing', code=301) |                 redirect('/testing', code=301) | ||||||
| @@ -381,6 +389,8 @@ class TestBase(object): | |||||||
|         assert r.status_int == 200 |         assert r.status_int == 200 | ||||||
|         assert r.body == 'it worked!' |         assert r.body == 'it worked!' | ||||||
|          |          | ||||||
|  |         self.assertRaises(ForwardRequestException, app.get, '/internal') | ||||||
|  |          | ||||||
|         r = app.get('/permanent') |         r = app.get('/permanent') | ||||||
|         assert r.status_int == 301 |         assert r.status_int == 301 | ||||||
|         r = r.follow() |         r = r.follow() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Yoann Roman
					Yoann Roman