Flask 登录模板不呈现静态图像文件(302 未找到)

问题描述 投票:0回答:0

我使用 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 的代码有关,但我不确定。任何建议将不胜感激。

python flask plotly-dash flask-login
© www.soinside.com 2019 - 2024. All rights reserved.