Как перенаправить на ту же страницу при неудачной авторизации - PullRequest
2 голосов
/ 15 июля 2009

Инфраструктура Django легко обрабатывает перенаправление, когда пользователь не может войти в систему должным образом. Однако это перенаправление идет на отдельную страницу входа. Я могу настроить шаблон так, чтобы он совпадал со страницей, на которой я вошел, но ни один из моих других объектов не существует на новой странице.

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

Как я могу исправить эту проблему? Любая помощь приветствуется.

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

Ответы [ 3 ]

6 голосов
/ 15 июля 2009

Вы хотите перенаправить на ссылающуюся страницу при неудачном входе?

... authentication code above

if user.is_authenticated():
    #show success view
else:
    return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('index'))

вы можете проверить, что URL-адрес ссылающейся страницы задан правильно, в противном случае установите для него URL-адрес по умолчанию (при условии, что ваш URL-адрес по умолчанию называется «index»).

1 голос
/ 19 июля 2009
  1. Используйте <IFRAME> на боковой панели, чтобы вызовите вид входа в систему - все постбэки произойдет в пределах iframe, так Ваша страница остается нетронутой. Если посетитель залогинен успешно, вы можно использовать JavaScript для перенаправления родительская страница на другой URL
  2. Используйте AJAX , чтобы опубликовать форму входа - достигает того же эффекта, что и (1), но это означает, что ваши посетители должны будут иметь браузеры с поддержкой javascript

Лично я предпочитаю иметь логин на отдельной странице. Если вы беспокоитесь только о том, что ваши посетители теряют свою текущую страницу (и не говорят, что она связана с суетливым клиентом), вы можете отобразить имя входа в лайтбокс . Я использовал все три подхода в прошлом, и я был бы рад опубликовать несколько примеров кода, если вам интересно.

0 голосов
/ 15 июля 2009

Это потому, что перенаправление на представление пропускает исходный контекст, который вы используете для визуализации страницы.

Вы упускаете просто простую логику здесь. Вы пытаетесь снова отобразить тот же шаблон, но без списка news_article.

Полагаю (в первую очередь), вы визуализируете шаблон, который показывает вам Статьи, а также форму входа, отправив две вещи: 1. Форма входа и 2. Список статей. Но во-вторых, когда пользователь не может пройти аутентификацию, вы больше не пропускаете одни и те же вещи. Передайте эти переменные снова в качестве контекста (вы также можете добавить сообщение об ошибке, если ваша форма не обрабатывает сообщения об ошибках).

if user.is_authenticated():
    #show success view
else:
    return render_to_response('same_template.html', {
        'error_msg': 'Username or password you provided was incorrect',
        'news_articles': NewsArticles.objects.all()[:3],
        'login_form': LoginForm(request.POST);
    })

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

Если вам нужен какой-то автоматизированный контекст, разработайте свой собственный контекстный процессор, например, auth-context-processor , который автоматически добавляется как «пользователь», всегда доступный для шаблона.

И, между прочим, вы все равно пропустите такой контекст, даже если вход в систему аутентифицирован. Поэтому, если этот конкретный контекст действительно важен, либо попробуйте отправить первичные ключи статей вместе с отправкой формы входа в систему, либо сохраните их в глобальном (самая уродливая вещь), либо просто пересмотрите и разделите поток (я думаю, это хорошо). 1016 *

...