Перенаправление вида пирамиды
Я пытаюсь интегрировать Mozilla Persona (browserid) в приложение Pyramid. Процесс входа в систему:
- пользователь может войти на любую страницу, нажав на кнопку входа
- всплывающее окно затем показывает форму входа
- когда пользователи вводят правильный логин / пароль, всплывающий вызов ajax вызывает представление Pyramid, которое проверяет учетные данные пользователей и вызывает функцию запомнить Pyramid, если проверка прошла успешно
- Затем JavaScript-код перезагружает текущую страницу
Теперь я хочу обработать случай, когда новый пользователь подписывается на веб-приложение, и представить новое представление, требующее дополнительных подробностей (желаемое имя пользователя и т. Д.).
Так как функция "запомнить" вызывается с помощью вызова ajax из всплывающего окна, я не могу перенаправить пользователя на страницу "/newuser". Таким образом, каждое представление должно перенаправлять новых пользователей на URL-адрес "/newuser" всякий раз, когда в запомненной таблице браузеров нет соответствующего пользователя в базе данных.
Есть ли способ перехватить пользовательские запросы перед вызовом представления, чтобы вместо этого вызвать представление "new_user"? Или, может быть, мой подход к аутентификации в корне неверен, и я должен полагаться на другой подход?
1 ответ
Один из способов сделать это - создать исключение, которое должно вызываться при создании пользователя, и использовать это исключение в качестве контекста представления, которое будет перенаправлять на новую страницу.
class NewUser(Exception):
pass
@view_config(context=NewUser)
def new_user_exception(request):
return HTTPFound(request.route_path('new_user'))
Убедитесь, что исключение возникает во время первого запроса после первого входа в систему (например, после создания объекта пользователя), и пользователь будет перенаправлен на нужную страницу.
Вы также можете поместить код страницы приветствия прямо в new_user_exception
, но без перенаправления эта страница будет иметь URL-адрес, запрашиваемый пользователем, что бы это ни было.
Другое решение было бы настроить как персонализированную часть. Для этого я собираюсь догадаться, что вы используете pyramid_persona (я писатель:)). Если нет, то, что я говорю, все равно будет применяться, и это будет еще проще сделать.
Что вы могли бы сделать, это:
- Измените представление входа в систему так, чтобы оно включало в ответ логическое значение, говорящее, является ли это первым входом в систему или нет.
- Измените JavaScript, чтобы проверить это логическое значение, перезагрузите страницу, если это не первый раз, и перенаправьте на страницу приветствия, если она есть.
Код для представления входа в систему может использовать представление входа в систему pyramid_persona следующим образом:
from pyramid_persona.views import login
@view_config(route_name='login')
def new_login(request):
response = login(request)
if response.status == 200: #the login worked
# tweak the response
return response
РЕДАКТИРОВАТЬ: Теперь есть часть об этом в документации pyramid_persona: сделать дополнительную работу или проверку при входе в систему.