Comment redirect avec Flask et jQuery

J’utilise Flask comme backend et jQuery pour un projet personnel sur lequel je travaille.

Pour me connecter je veux faire ceci:

$.ajax({ type: "POST", data: JSON.ssortingngify(body), //username and password contentType: 'application/json; charset=utf-8', url: "/login", success: successFunction, error: errorFunction, complete: completeFunction }); 

Dans errorFuction, je dirais à l’utilisateur que son nom d’utilisateur ou son mot de passe est incorrect, etc.

Sur le backend mon chemin / login ressemble à ceci

 @app.route("/login", methods=['GET', 'POST']) def login(): if(request.method == "POST"): #resortingeve the username and password sent data = request.json if(data is None or not 'username' in data or not 'password' in data): abort(400) else: count = User.query.filter(User.username == data['username']).count() if(count == 0): abort(404) #that user doesnt exist else: passIsCorrect = User.query.filter(User.username == data['username'], User.password == data['password']).count() if(passIsCorrect): session['user'] = data['username'] return redirect(url_for('index')) else: abort(401) else: return render_template('login.html') 

Toutefois, côté client, le navigateur ne redirige pas et si je regarde l’object de réponse dans la fonction complète, je vois ce qui serait normalement renvoyé par mon ‘/’ route: 200 OK et le modèle index.html.

Ma question est:

Existe-t-il un moyen d’intercepter la redirection du client?

Je suppose que le problème est dû au fait que jquery lance la demande et non au navigateur.

Ma première tentative de résolution de ce problème a été de construire moi-même la réponse à l’aide de make_response et de définir l’en-tête Location, mais cela a entraîné le même comportement. Ma solution actuelle est de retourner 200 et ensuite le client ne window.location = "/" , mais cela semble hacky

Les redirections sur les appels ajax ne fonctionnent pas, les navigateurs ne les respectent pas. La plupart des gens implémentent leur propre solution de redirection personnalisée, en renvoyant le code 200 et une URL vers laquelle redirect dans la réponse JSON. Voir cette question pour quelques bons exemples.

En remarque, POST le formulaire de connexion via ajax ne vous donne pas vraiment un avantage, je laisserais le navigateur poster le formulaire normalement, puis votre fonction d’affichage Flask redirige vers une nouvelle page en cas de succès ou redirige vers la page de connexion en cas d’échec, éventuellement avec un message flash pour informer l’utilisateur de l’erreur.

Aucune raison, utilisez la redirection avec ajax car elle renverra le contenu redirigé (dans votre cas, uniquement le contenu avec le noeud final d’ index ). Donc, vous pouvez renvoyer le lien pour redirect si tout est ok (statut 200) à la place de la redirection réelle:

 return url_for('index') 

et le traiter avec votre js:

 var successFunction = function (data) { // do something window.location = data; };