gpt4 book ai didi

python - 使用静态用户的 flask 登录总是产生 401- 未经授权

转载 作者:太空狗 更新时间:2023-10-29 21:53:16 25 4
gpt4 key购买 nike

我正在尝试构建一个 super 简单的网络应用程序供我自己使用。我将是唯一的用户,所以我觉得不需要涉及数据库来进行用户管理。我正在尝试使用 flask-login,但即使我对 login_user 的调用成功,在重定向到带有 @login_required< 的页面后,我仍然遇到 401-Unauthorized 页面。这是我的应用程序的全部内容:

from flask import Flask, render_template, request, flash, redirect, url_for
from flask.ext.login import LoginManager, login_user, logout_user, current_user, login_required, UserMixin

app = Flask(__name__, static_url_path="")
app.secret_key = "[redacted]"

login_manager = LoginManager()
login_manager.init_app(app)
#login_manager.login_view = "login"

class User(UserMixin):
def __init__(self, id):
self.id = id

nathan = User('nathan')

@login_manager.user_loader
def load_user(userid):
if userid == 'nathan':
return nathan
else:
return None

@app.route("/logout")
@login_required
def logout():
logout_user()
return redirect(url_for('login'))

@app.route('/')
@login_required
def index():
return render_template('index.html')

@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == 'POST':
if request.form['username'] == 'nathan'\
and request.form['password'] == '[redacted]':
login_user(nathan, remember=True)
flash('logged in...', 'success')
return redirect(request.args.get("next") or url_for("index"))
else:
flash('Incorrect username or password. Try again.', 'error')

return render_template("login.html");

if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)

我已验证登录确实成功(login_user 返回 true)并且 load_user 正在返回 nathan 对象。

[编辑] 此外,我目前正在使用 Flask 开发服务器,以防相关。

不确定我哪里出错了。提前致谢!

最佳答案

更新:

自 Flask-Login 更新版本 (0.2.2) 以来,这不再是问题。查看 this 中的更改提交。

如果您使用的是旧版本,请继续阅读。


这里的问题是 static_url_path=""。要使 Flask-Login 正常工作,您不能使用空字符串 static_url_path

following lines在 Flask-Login 源代码(旧版本)中揭示了这一点:

if (current_app.static_url_path is not None and
request.path.startswith(current_app.static_url_path)
):
# load up an anonymous user for static pages
_request_ctx_stack.top.user = self.anonymous_user()
return

由于您的 static_url_path"" if 条件评估为 True,因此您访问的每个页面都像静态页面一样,因此 Flask-Login 始终加载匿名用户,而不是继续加载实际用户(使用 load_user 回调)。


同时不要忘记取消注释 #login_manager.login_view = "login"


如果您仍想将应用程序本身的根文件夹用作静态文件夹,请查看 this解决方案,使用 SharedDataMiddleWare :

app.debug = True
if app.config['DEBUG']:
from werkzeug import SharedDataMiddleware
import os
app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
'/': os.path.dirname(__file__)
})

if __name__ == "__main__":
app.run(host="0.0.0.0")

关于python - 使用静态用户的 flask 登录总是产生 401- 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com