2012-04-27 1 views
1

Я хотел бы проверить состояние перед каждым запросом и вызвать разные виды. Как это достигается?Как добавить условное перенаправление на каждый вид в Pyramid?

Одно решение, я могу думать о том, что-то добавить к абонентскому NewRequest, но я застрял:

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

ответ

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

+1

Это должно быть 'рейз', вы ничего не можете вернуть от подписчиков. –

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') 
+0

Предположим, что я хотел бы показать всегда (для любого URL) sign_in, если пользователь sign_out request.path не модифицируется bacuase i got: *** AttributeError: невозможно установить атрибут – xliiv

+0

извините, что это 'request.path_info ', обновленный ответ. Вы можете показать страницу таким образом, но в этом случае вы, вероятно, захотите переадресовать с помощью метода 'raise HTTPFound', который показал @raj, или использовать auth-систему Pyramid для ее автоматической обработки. –

+0

Я думаю, что решение @Raj является лучшим для моего случая. Спасибо всем. – xliiv

1

Еще один вариант «проверить состояние ... и вызвать различные точки зрения» заключается в использовании пользовательский вид предикаты

От Cris McDonough's blog post:

def example_dot_com_host(info, request): 
     if request.host == 'www.example.com: 
      return True 

Это пользовательский предикат есть. Он возвращает True, если имя хоста - www.example.com. Вот как мы используем его:

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

Однако для конкретной задачи (отображается страница входа, если пользователь не имеет прав для просмотра страницы) лучший способ для достижения этой цели было бы set up permissions для представления, так в рамках вызывает исключение, когда пользователь не имеет разрешения, а затем регистрирует custom view for that exception, который будет показывать форму знака.

+0

Прохладный материал, который я не знал, и я многому научился, это не идеальное решение для меня, потому что мне пришлось бы изменить все мои взгляды, но спасибо. :) – xliiv

 Смежные вопросы

  • Нет связанных вопросов^_^