Frasco de inicio de sesión no redirigir a la página anterior

He visto algunas preguntas con esto en mente, pero no he podido abordar mi problema. Tengo una aplicación Flask con flask-login para la gestión de sesiones. Y, cuando bash ver una página sin iniciar sesión, me redireccionan a un enlace en forma de /login/?next=%2Fsettings%2F

El problema es, hasta donde puedo entender, que el “siguiente” argumento contiene la parte del sitio que realmente necesito, pero al enviar una solicitud a un formulario de inicio de sesión, se realiza a través de POST , por lo que este argumento no es válido. Ya está disponible para que lo redirija a.

Intenté usar Request.path desde Request (y url), pero ambos devolvieron el /login/ como el url / path de la solicitud, no el /login/?next=xxx real.

Mi método de inicio de sesión es el siguiente:

 @app.route('/login/', methods=['GET', 'POST']) def login(): if request.method == 'POST': #getting the user user = User.get(request.form['username']) if user.user is None: return redirect('/login/') #actual login proces if user and check_password_hash(user.user.password, request.form['password']): login_user(user, remember=remember) #the redirection portion of the login process return redirect(request.path or ("/")) # I tried various options there but without success, like request.args['next'] and such return redirect('/login/') else: return redirect('/') 

Gracias

request.path no es lo que estás buscando. Devuelve la ruta real de la URL. Entonces, si su URL es /a/?b=c , entonces request.path devuelve /a , no c como está esperando.

El next parámetro es después de la ? en la URL, por lo tanto, es parte de la “cadena de consulta”. Flask ya ha analizado los elementos de la cadena de consulta, y puede recuperar estos valores utilizando request.args . Si enviaba una solicitud a la URL /a/?b=c e hizo request.args.get('b') , recibiría "c" .

Por lo tanto, desea utilizar request.args.get('next') . La documentación muestra cómo funciona esto en un ejemplo .

Otra cosa a tener en cuenta es que al crear su formulario de inicio de sesión en HTML, no desea establecer el atributo “acción”. Entonces, no hagas esto ..

 
...

Esto hará que la solicitud POST se realice en /login , no /login/?next=%2Fsettings%2F , lo que significa que su next parámetro no será parte de la cadena de consulta y, por lo tanto, no podrá recuperarlo. Desea omitir el atributo “acción”:

 
...

Esto hará que el formulario se publique en la URL actual (que debería ser /login/?next=%2Fsettings%2f ).

Puede utilizar las sesiones de mongoengine para pasar el parámetro ‘next_url’ con la sesión de matraz ( from flask import session ). En el archivo py donde define su aplicación y login_manager:

 from flask.ext.mongoengine import MongoEngineSessionInterface app.session_interface = MongoEngineSessionInterface(db) @login_manager.unauthorized_handler def unauthorized_callback(): session['next_url'] = request.path return redirect('/login/') 

y luego en la vista de inicio de sesión:

 def login(): # ... if success next_url = session.get('next_url', '/') session.clear() return redirect(next_url)