Войти и перенаправить - PullRequest
3 голосов
/ 13 мая 2010

Это мой логин просмотров:

def login(request):

    redirect_to = request.REQUEST.get("next")
    if request.method == 'POST': 

        formL = LoginForm(data=request.POST)           
        if formL.is_valid(): 

            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = "/blogs/"

            from django.contrib.auth import login
            login(request, formL.get_user())
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
            return HttpResponseRedirect(redirect_to)

    else:

    formL = LoginForm(request)                 

request.session.set_test_cookie()  

return render_to_response('blogs.html', {
    'formL': formL, }, context_instance=RequestContext(request))

login = never_cache (логин)

Когда я, например, захожу на example.com/myblog/, меня перенаправляют на example.com/accounts/login/?next=/myblog/

.

но когда я вставляю user и psw для входа в систему, меня перенаправляют в / blogs /, а не в / myblog /

Почему?

Редактировать: request.REQUEST.get ('next', '') всегда возвращать ''

Не знаю, почему: - \

Ответы [ 2 ]

8 голосов
/ 13 мая 2010

Как выглядит шаблон вашей формы входа?

Ваша проблема

Вы не отправляете путь redirect_to к шаблону, и вы должны это сделать. Ваше возвращение должно выглядеть так:

return render_to_response('blogs.html', {
        'formL': formL,
        'next': redirect_to,
    }, context_instance=RequestContext(request)
)

Действие формы входа должно выглядеть следующим образом:

<form action="/your_login_url/?next={{ next }}" method="post">

Поэтому, когда вы переходите на /myblog/, вы перенаправляетесь на /your_login_url/?next=/myblog/, представление входа в систему затем отображает форму входа в систему и заменяет переменную next в атрибуте действия формы входа в систему, чтобы она выглядела как /your_login_url/?next=/myblog/ и при отправке форма, в которую вы вошли и перенаправлены на /myblog/ (материал после if request.method == 'POST': будет выполнен).

На ваш взгляд, redirect_to = request.REQUEST.get("next") отлично работает, когда вы только GET страница входа, но когда вы POST открываете ее, в GET не устанавливается переменная next.

Также обратите внимание

Просмотр логина не должен отображать ваш блог, просмотр блогов должен это делать.

Так выглядит возвращенный ответ Django, обратите внимание на строку, где написано redirect_field_name: redirect_to,, redirect_field_name имеет значение next по умолчанию.

return render_to_response(template_name, {
    'form': form,
    redirect_field_name: redirect_to,
    'site': current_site,
    'site_name': current_site.name,
}, context_instance=RequestContext(request))

И, похоже, вы переопределяете представление входа в систему только для перенаправления по умолчанию? Это не правильно ИМХО. Правильное место для установки местоположения по умолчанию для перенаправления входа в систему находится в вашем файле settings.py путем установки LOGIN_REDIRECT_URL .

Но, поскольку вы пишете свой собственный вид входа в систему, почему бы не использовать тот, что в django, в качестве каркаса, а затем расширить на нем то, что вам нужно.

1 голос
/ 13 мая 2010

Потому что

 not redirect_to or '//' in redirect_to or ' ' in redirect_to

оценивается как True?


Может быть, если мы научим человека ловить рыбу? http://docs.python.org/library/logging.html

Поместите это наверх

import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)

Поместите это там, где это кажется подходящим в вашем коде (например, после оператора if)

logging.debug("redirect_to = %s" % redirect_to)

Запустите его, затем посмотрите на содержимое '/tmp/logging_example.out'

...