我想在每个请求之前检查一个条件并调用不同的视图。这是如何实现的?
我能想到的一种解决方案是向订阅者 NewRequest 添加一些内容,但我被卡住了:
@subscriber(NewRequest)
def new_request_subscriber(event):
if condition:
#what now?
我想在每个请求之前检查一个条件并调用不同的视图。这是如何实现的?
我能想到的一种解决方案是向订阅者 NewRequest 添加一些内容,但我被卡住了:
@subscriber(NewRequest)
def new_request_subscriber(event):
if condition:
#what now?
@subscriber(NewRequest)
def new_request_subscriber(event):
if condition:
raise pyramid.httpexceptions.HTTPFound(location=somelocation) ## to issue a proper redirect
更多信息可以在这里找到:http: //pyramid.readthedocs.org/en/latest/api/httpexceptions.html#pyramid.httpexceptions.HTTPFound
好吧,您提供的有关“条件”或“调用不同视图”的含义的信息很少,所以我假设您不想调用重定向,而是希望应用程序认为正在使用不同的 URL请求。为此,您可以查看pyramid_rewrite
,这对于这些事情非常方便,或者您可以更改NewRequest
订阅者中的请求路径,因为它在 Pyramid 调度到视图之前被调用。
if request.path == '/foo':
request.path = '/bar':
config.add_route('foo', '/foo') # never matches
config.add_route('bar', '/bar')
“检查条件......并调用不同的视图”的另一个选项是使用自定义视图谓词
def example_dot_com_host(info, request):
if request.host == 'www.example.com:
return True
那是那里的自定义谓词。如果主机名是 www.example.com,则返回 True。以下是我们如何使用它:
@view_config(route_name='blogentry', request_method='GET')
def get_blogentry(request):
...
@view_config(route_name='blogentry', request_method='POST')
def post_blogentry(request):
...
@view_config(route_name='blogentry', request_method='GET',
custom_predicates=(example_dot_com_host,))
def get_blogentry_example_com(request):
...
@view_config(route_name='blogentry', request_method='POST',
custom_predicates=(example_dot_com_host,))
def post_blogentry_example_com(request):
...
但是,对于您的特定问题(如果用户无权查看页面,则显示登录页面)实现此目的的更好方法是设置视图权限,以便框架在用户无权时引发异常,然后为该异常注册一个自定义视图,该视图将显示一个登录表单。