Pergunta

Esta é a minha visualização de login:

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 = nunca_cache (login)

Quando vou, por exemplo, para exemplo.com/myblog/, então fui redirecionado para exemplo.com/accounts/login/?next=/myblog/

Mas quando eu insiro o usuário e o PSW para o login, fui redirecionado para /blogs /e não /myblog /

Por quê ?

EDIT: request.request.get ('Next', '') sempre retorna '' '

Eu não sei por que:-

Foi útil?

Solução

Como é o seu modelo de formulário de login?

Seu problema

Você não está enviando o redirect_to caminho para o seu modelo e você deve. Seu retorno deve ficar assim:

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

A ação do formulário de login deve ficar assim:

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

Então, quando você for para /myblog/ você é redirecionado para /your_login_url/?next=/myblog/, a visualização de login renderiza o formulário de login e substitui o next variável no atributo de ação do formulário de login para que pareça /your_login_url/?next=/myblog/ e quando você envia o formulário em que você está conectado e redirecionado /myblog/ (coisas depois if request.method == 'POST': é executado).

Na sua opinião, redirect_to = request.REQUEST.get("next") Funciona bem quando você apenas você GET a página de login, mas quando você POST para isso não há next variável definida no get.

Observe também

A visualização de login não deve renderizar seu blog, a exibição de blogs deve fazer isso.

É assim que a resposta retornada de Django se parece, observe a linha onde ela diz redirect_field_name: redirect_to,, redirect_field_name tem o valor de next por padrão.

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

E você parece substituir a visualização de login apenas para redirecionamento padrão? Isso não está certo. O lugar certo para definir o local padrão para redirecionamento de login está em seus configurações. Login_redirect_url.

Mas, como você está escrevendo sua própria visualização de login, por que não usar o em Django como um esqueleto e depois expande o que você precisa.

Outras dicas

Porque

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

Avalia como verdadeiro?


Talvez se ensinarmos o homem a pescar?http://docs.python.org/library/logging.html

Coloque isso no topo

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

Coloque isso onde parece apropriado em seu código (por exemplo, após a instrução IF)

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

Execute -o e olhe para o conteúdo de '/tmp/logging_example.out'

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top