Pregunta

Este es mi punto de vista de inicio de sesión:

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

Cuando voy, por ejemplo, a example.com/myblog/ entonces he estado redirección a example.com/accounts/login/?next=/myblog /

pero cuando inserto de usuario y PSW de entrada entonces he estado redirección a / blogs / no / myblog /

¿Por qué?

Editar: request.REQUEST.get ( 'siguiente', '') siempre vuelven ''

No sé por qué: - \

¿Fue útil?

Solución

¿Cómo funciona su entrada mirada plantilla de formulario como?

Su problema

No está enviando el camino redirect_to a su plantilla y que debería. Su declaración debe tener este aspecto:

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

La acción de formulario de acceso debería tener este aspecto:

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

Así que cuando vas a /myblog/ te redirige a /your_login_url/?next=/myblog/, la vista de inicio de sesión a continuación, hace que la ventana de acceso y sustituye a la variable next de identificación no son atributo de acción del formulario para que parezca que /your_login_url/?next=/myblog/ y al momento de enviar el formulario obtenido conectado y redirigido a /myblog/ (cosas después if request.method == 'POST': es ejecutado).

En su opinión, redirect_to = request.REQUEST.get("next") funciona bien cuando sólo GET la página de inicio de sesión, pero cuando se POST a que no hay next conjunto variable en GET.

nota también

Identificación vista no debe hacer que su blog, los blogs de vista va a hacer eso.

Esta es la forma devueltos miradas de respuesta de Django como, tenga en cuenta la línea donde dice redirect_field_name: redirect_to,, redirect_field_name tiene el valor de next por defecto.

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

Y, parece que anular la vista de inicio de sesión única para la redirección de forma predeterminada? Esta no es mi humilde opinión la derecha. El lugar adecuado para definir la ubicación por defecto para la redirección de entrada está en su settings.py estableciendo LOGIN_REDIRECT_URL .

Sin embargo, dado que usted está escribiendo su propio punto de vista de inicio de sesión por qué no usar el uno en Django como un esqueleto y luego se expande en él lo que necesita.

Otros consejos

Debido

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

se evalúa como verdadera?


Tal vez si enseñamos el hombre a los peces? http://docs.python.org/library/logging.html

Ponga esto en la parte superior

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

Ponga esto donde parece apropiado del código (por ejemplo, después de la sentencia if)

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

Ejecutar, y luego mira el contenido de '/tmp/logging_example.out'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top