Django 1.2: проблема с входом в систему (параметр GET: следующий) - PullRequest
3 голосов
/ 05 октября 2010

У меня новый вопрос о django (я публикую их потерянные в эти дни ^^).

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

Аутентификация работает хорошо, но у меня проблема с параметром GET 'next'.Он устанавливается автоматически представлениями, перенаправляющими пользователей для аутентификации.На мой взгляд, он используется для перенаправления пользователя после успешного входа в систему.

Вот код:

from django.http import HttpResponse
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.utils.translation import ugettext as _
from django.contrib import messages
from django.template import RequestContext
from django.contrib.auth import authenticate, login, logout

import logging
logger = logging.getLogger("views")

def login_user(request):
    """
    Displays the login form or authenticates the user if called by POST.
    """
    accepted = False

    next = request.GET.get('next', None)

    if not request.user.is_authenticated():
        if request.POST:
            # Get the form data and check the user credentials
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username, password=password)

            if user is not None:
                if user.is_active:
                    # Log the user in
                    login(request, user)
                    logger.info("Login of user : %s", user.username)

                    # Confirm the login
                    messages.success(request,_('Login successful. Welcome !'))
                    accepted = True
                else:
                    messages.error(request,_('This account has been disabled by the administrator.'))
            else:
                messages.warning(request,_('The given username or password is invalid. Please try again.'))
    else:
        # If already authenticated
        accepted = True

    # Choose where to go
    if accepted:
        return HttpResponse(next)
        if next:
            return HttpResponseRedirect(next)
        else:
            return HttpResponseRedirect(reverse('myview'))
    else:
        return render_to_response('login.html',
                                    context_instance=RequestContext(request))

Следующий параметр корректен, когда пользователь получает доступ к представлению входа в систему, когда ужеauthenticated (first else).

Когда анонимный пользователь пытается перейти к / editor / 25 (например) и перенаправлен для входа в систему для аутентификации, «next» всегда равно None, даже если присутствует в URL (должен быть "/editor/25").

Где-то должна быть одна простая ошибка.Может быть, это связано с authenticate () или login () (django.contrib.auth).

Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

Когда анонимный пользователь пытается перейти к / editor / 25 (например) и перенаправляется для входа в систему для аутентификации, «next» всегда имеет значение «None», даже если присутствует в URL (должно быть «/ editor / 25») .

Это звучит странно. Можете ли вы проверить, что URL действительно содержит ?next=/editor/25/ в качестве строки запроса? Также войдите request.GET и посмотрите, что получится.

Также вы можете выбрать параметр next из request.GET и включить его в качестве (необязательного) скрытого ввода в форму при визуализации шаблона. Представление login модуля авторизации делает это. Таким образом, ваша форма может получить next с request.POST на POST.

0 голосов
/ 13 июля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...