I have a flask app with jwt_extended config as auth. For all pages, it works without any issue. But for pages with a form and post methods, when I submit the form, the app redirect me to the login page in loop ( even if I log or already loggued ). If I put : JWT_COOKIE_CSRF_PROTECT = False I don't have any issue search/search.html {% extends "base.html" %} {% block content %} <nav class="uploadbar"> <form id="form-navbar" method="POST" action="/search/" class="form-inline formupload" enctype="multipart/form-data"> <input id="host-navbar-upload" class="form-control mr-sm-2" name="hostname-list" type="file" accept=".csv" placeholder="Upload a csv file..." aria-label="Upload"> <button id="upload-navbar" class="btn btn-primary my-2 my-sm-0 button-form-upload" type="submit">Upload</button> </form> </nav> {% endblock %} auth/routes.py from app.auth import bp from flask import current_app from app.extensions import ldap from flask import ( g, render_template, request, session, redirect, url_for, jsonify, make_response, flash ) from flask_jwt_extended import ( create_access_token, create_refresh_token, set_access_cookies, set_refresh_cookies, unset_jwt_cookies, get_jwt_identity ) from flask_jwt_extended import jwt_required @bp.route('/') @jwt_required() def index(): return jsonify('Login Successfull') @bp.route("/login/", methods=["GET","POST"]) def login(): if g.user: return redirect(url_for("dashboard.dashboard")) if request.method == "POST": user = request.form["username"] passwd = request.form["password"] test = ldap.bind_user(user, passwd) if test is None or passwd == "": flash('Invalid username or password. Please try again.', 'danger') current_app.logger.info('Invalid password for user : %s', user) else: access_token = create_access_token(identity=user) refresh_token = create_refresh_token(identity=user) response = make_response(redirect(url_for('dashboard.dashboard'))) set_access_cookies(response, access_token) set_refresh_cookies(response, refresh_token) return response return render_template('auth/login.html',title='Login') @bp.route("/token/refresh", methods=["POST"]) @jwt_required(refresh=True) def refresh(): identity = get_jwt_identity() access_token = create_access_token(identity=identity) return jsonify(access_token=access_token) @bp.route("/logout/") @jwt_required() def logout(): response = make_response(redirect(url_for("auth.login"))) unset_jwt_cookies(response) return response search/routes.py from app.search import bp from flask import render_template from flask import request from app.extensions import db, ldap from flask import current_app as app from flask_jwt_extended import jwt_required import pandas as pd from app.utils import df_parser @bp.route('/', methods=["GET", "POST"]) @jwt_required() def search(): host = 'vautour2' if request.method == "POST": df = pd.read_csv(request.files.get('hostname-list')) df = df_parser(df) hostlist = df['name'].tolist() print(hostlist) return render_template('search/search.html',title='Search', host=host, ) @bp.route('/result/', methods=["GET", "POST"]) @jwt_required() def result(): if request.method == "POST": host = request.form["hostname"] return render_template('search/result.html',title='Search result', host=host, ) Any idea ? Continue reading...