2014-02-02 7 views
1

Как только пользователь регистрируется в первый раз в своем приложении, он должен сделать некоторые выборы. Я делаю это, перенаправляя его на страницу конфигурации. Эти выборы имеют решающее значение для существования всей веб-страницы, поэтому приложение не должно ничего делать, прежде чем отправлять их. Я хочу сделать запрос слушателем, который будет проверять, установлены ли у пользователя эти параметры, а если нет, он перенаправит его на нужную страницу. Я сделал это с помощью:Переадресация пирамиды в обработчике событий

@subscriber(NewRequest) 
def has_preferences_set(event): 
    request = event.request 
    user = request.user 
    if not user.preferences: 
     raise HTTPFound(location=request.route_url('set_my_preferences')) 

Однако у меня есть некоторые проблемы в нем. Во-первых, это событие на самом деле называется 6 раз по одному запросу (более того, ни один из них не предназначен для фактического запроса, 2 для статических файлов, 4 для pyramid_toolbar). Во-вторых, после того, как перенаправлять я получаю эту ошибку:

Firefox has detected that the server is redirecting the request for this address in a way that will never complete

ответ

1

Относительно Перенаправление терпят неудачу, это потому, что у вас есть в бесконечном перенаправлением. Когда вы загружаете свой маршрут «set_my_preferences», ваше событие запускается и перенаправляется снова.

Что касается 6 запросов, это правда, что все эти запросы, когда в dev, обслуживаются Pyramid. Однако в производстве статические файлы будут (должны быть) обслуживаться сервером впереди (например, nginx), и панель инструментов не будет обслуживаться.

Также обратите внимание, что в базе данных загружается пользовательская настройка в другой таблице для каждого запроса. Вероятно, вы должны кэшировать его или что-то в этом случае, если вам действительно нужен каждый запрос.

И это странное состояние, которое у вас здесь. Некоторые пользователи не имеют предпочтений и другие имеют предпочтения. Вероятно, вы должны вставлять предпочтения по умолчанию для всех пользователей и позволять им изменять их. Вы избежите множества возможных ошибок, а также уменьшите количество «if not user.preference» в своем приложении.

2

Посмотрите на todopyramid. Он перенаправляет новых и существующих пользователей с недопустимыми настройками на страницу учетной записи, чтобы настроить их пользовательские настройки. При каждом последующем входе действительные пользовательские настройки будут снова обеспечены.

todopyramid

Вы можете настроить логику проверки ваших потребностей. todopyramid работает хорошо и инкапсулирует концепцию, в которой вы нуждаетесь, в общие модели и представления. Никаких магических обработчиков событий не требуется.

todopyramid даже имеет

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