1

我想在每个请求之前检查一个条件并调用不同的视图。这是如何实现的?

我能想到的一种解决方案是向订阅者 NewRequest 添加一些内容,但我被卡住了:

@subscriber(NewRequest)
def new_request_subscriber(event):
  if condition:
    #what now?
4

3 回答 3

3
@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

于 2012-04-27T14:50:33.440 回答
1

好吧,您提供的有关“条件”或“调用不同视图”的含义的信息很少,所以我假设您不想调用重定向,而是希望应用程序认为正在使用不同的 URL请求。为此,您可以查看pyramid_rewrite,这对于这些事情非常方便,或者您可以更改NewRequest订阅者中的请求路径,因为它在 Pyramid 调度到视图之前被调用。

if request.path == '/foo':
    request.path = '/bar':

config.add_route('foo', '/foo') # never matches
config.add_route('bar', '/bar')
于 2012-04-27T15:12:01.417 回答
1

“检查条件......并调用不同的视图”的另一个选项是使用自定义视图谓词

来自Cris McDonough 的博客文章

   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):
      ...

但是,对于您的特定问题(如果用户无权查看页面,则显示登录页面)实现此目的的更好方法是设置视图权限,以便框架在用户无权时引发异常,然后为该异常注册一个自定义视图,该视图将显示一个登录表单。

于 2012-04-28T08:12:47.317 回答