django - перенаправление нескольких входов в систему - PullRequest
0 голосов
/ 01 ноября 2011

Я хочу разрешить пользователям переходить на их страницу по умолчанию (например, mywebsite.com/userpage), когда они используют форму входа.

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

Это то, что у меня есть для функции входа в систему:

views.py

def user_login(request):
    if request.method == 'POST': 
        form = AuthenticationForm(request.POST)
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                # Redirect to a successpage
                if request.POST['next']:
                    return HttpResponseRedirect(request.POST['next'])
                else:    
                    return HttpResponseRedirect("/" + username + "/")
            else:
                errors = 'This account has been disabeled.'
        else:
            # Return an 'invalid login' error message.
            errors = 'There is a problem with the user name and/or the password. Please try again.'
    else:
        form = AuthenticationForm()
    return render_to_response("registration/my_login.html", locals(), context_instance=RequestContext(request))

urls.py

urlpatterns = patterns('',
                       url(r'^login/$', user_login,),

my_login.html

<form action="." method="post" >{% csrf_token %}
    {{errors}}
    {{ form.as_p }}
    <p class="submit"><button type="submit" name="login_user_button" value="Login">Log in</button></p>
    <input type="hidden" name="next" value="{{ next }}">
    </form>

Моя проблема в том, что я не знаю, как получить значения переменной "next", поэтому я могу использовать ее в моей функции user_login для перенаправления.

Как вы можете видеть, я пытался получить его с помощью request.POST['next'], но получил пустую строку, поэтому по какой-то причине никакое значение не было подписано в переменной "next".

Есть идеи?

1 Ответ

2 голосов
/ 02 ноября 2011

Моя рекомендация - не беспокойтесь об использовании функции входа в систему. Ты просто изобретаешь колесо. Вместо этого используйте представление входа в систему , которое поставляется с модулем django.auth, и отправьте пользователей на промежуточную страницу (с URL-адресом, определенным в settings.LOGIN_REDIRECT_URL ), которая перенаправляет их туда им нужно идти.

Это промежуточное представление может быть чем-то простым:

@login_required
def index(request):
    return redirect('user-page', request.user.username)

Обратите внимание, что я изменил это перенаправление, чтобы использовать именованное представление. Вы не хотите, чтобы происходили странные вещи, если пользователь называет себя именем пользователя, совпадающим с URL сайта!

Также обратите внимание на декоратор login_required . Это автоматически дает вам страницу перенаправления, которую вы запрашиваете.

...