Вопрос

Это мои виды входа в систему:

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))

логин = Never_cache(логин)

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

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

Почему ?

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

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

Это было полезно?

Решение

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

Твоя проблема

Вы не отправляете 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 для этого нет next переменная, установленная в GET.

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

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

Вот как выглядит возвращенный ответ 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 в качестве скелета, а затем расширить его тем, что вам нужно.

Другие советы

Так как

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

оценивает правду?


Может быть, если мы научим мужчине ловить рыбу?http://docs.cython.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»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top