我使用 plotly dash 创建了一个多页仪表板。我正在使用 flask 和 flask-login 来密码保护它。一切正常除了我无法让 flask 模板登录页面显示存储在 /static 目录中的图像文件。我的浏览器检查器 (chrome) 在“标头”中显示“302 已找到”错误消息,在“响应”和“请求发起者链”中显示“无法加载响应数据:由于此请求已重定向,因此内容不可用”错误消息' 看起来像这样:
我当前的代码:
server = Flask(__name__, static_url_path="", static_folder="static")
load_dotenv()
basedir = os.path.abspath(os.path.dirname(__file__))
server.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(basedir, "users.db")
server.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
server.config.update(SECRET_KEY=os.getenv("SECRET_KEY"))
bcrypt = Bcrypt()
db = SQLAlchemy(server)
login_manager = LoginManager()
login_manager.init_app(server)
login_manager.login_view = "/login"
class User(UserMixin, db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.Text, unique=True)
password = db.Column(db.Text, unique=True)
@login_manager.user_loader
def load_user(id):
return db.session.get(User, int(id))
@server.before_request
def check_login():
if request.method == "GET":
if request.path in ["/login"]:
return
if current_user:
if current_user.is_authenticated:
return
else:
for pg in dash.page_registry:
if request.path == dash.page_registry[pg]["path"]:
session["url"] = request.url
return redirect(url_for("login"))
else:
if current_user:
if request.path == "/login" or current_user.is_authenticated:
return
return jsonify({"status": "401", "statusText": "unauthorized access"})
message = "Invalid username and/or password."
@server.route("/login", methods=["GET", "POST"])
def login():
if request.method == "GET":
if current_user.is_authenticated:
return redirect("/")
return render_template("login.html", message=message)
if request.method == "POST":
if request.form:
user = request.form["username"]
password = request.form["password"]
user_data = User.query.filter_by(username=user).first()
if user_data:
if bcrypt.check_password_hash(user_data.password, password):
login_user(user_data)
if "url" in session:
if session["url"]:
url = session["url"]
session["url"] = None
return redirect(url)
return redirect("/")
return redirect(url_for("login", error=1))
@server.route("/logout", methods=["GET"])
def logout():
if current_user:
if current_user.is_authenticated:
logout_user()
return render_template("login.html", message="You have been logged out.")
不确定我是否需要发布整个 login.html 文件,但我用来显示图像的代码是:
<header>
<div style="text-align: center">
<img src="{{ url_for('static', filename='logo.jpg') }}"/>
</div>
</header>
我已经在 Stack 上搜索了答案并尝试了很多东西,但没有骰子。我是 flask 和 flask-login 的相对新手,所以我怀疑它与将静态请求重新路由到 /login 的代码有关,但我不确定。任何建议将不胜感激。