gpt4 book ai didi

python - Flask-Login:user_callback 函数在登录后重置为 None

转载 作者:行者123 更新时间:2023-11-28 19:19:18 25 4
gpt4 key购买 nike

<分区>

这看起来像是一个很长很复杂的问题,但我猜这不是。这可能与我使用 flask-login 的方式有关。由于我是 flask 和 flask-login 的新手,所以我无法弄清楚。我已经坚持这一天了。

我收到错误:无法在我的 Flask 应用程序中调用 NoneType。最奇怪的是,登录后 user_callback 函数以某种方式设置为 None。

我在我的 flask 应用程序中设置了以下 url

/admin/login - 管理员登录 URL

@application.route(base_url + '/login', methods=['POST', 'GET'])
def admin_login():
if g.user is not None and g.user.is_authenticated():
return redirect(url_for('index'))
form = LoginForm(request.form)
if request.method == "POST" and form.validate():
if request.form['username'] == "root" and request.form['password'] == os.environ['ROOT_PASS']:
user = User("root", 1)
login_user(user)
return "OK! Logged In!"
else:
return render_template('admin_login.html', error="Invalid username or password", form=form)
return render_template('admin_login.html', form=form)

/test - 具有以下 View 函数的受限 URL

@application.route('/test')
@login_required(1)
def test():
return "hello"

在登录之前,一切似乎都正常。如果我去/test 我得到一个未经授权的错误,因为它应该工作。另外,如果我转到/admin/login,我会得到登录模板。

但是登录后,我无法进入/test 或/admin/login。我收到无法调用 NoneType 错误。这是完整的回溯。

Traceback (most recent call last):
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app
response = self.full_dispatch_request()
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask/app.py", line 1344, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/harry/Sites/microblog/lib/helpers/login.py", line 14, in decorated_view
if not current_user.is_authenticated():
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/werkzeug/local.py", line 338, in __getattr__
return getattr(self._get_current_object(), name)
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/werkzeug/local.py", line 297, in _get_current_object
return self.__local()
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask_login.py", line 46, in <lambda>
current_user = LocalProxy(lambda: _get_user())
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask_login.py", line 796, in _get_user
current_app.login_manager._load_user()
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask_login.py", line 364, in _load_user
return self.reload_user()
File "/Users/harry/Sites/microblog/flask/lib/python2.7/site-packages/flask_login.py", line 326, in reload_user
user = self.user_callback(user_id)
TypeError: 'NoneType' object is not callable

而且看起来 user_callback 函数已设置为 None。

但是我实际上已经添加了user_loader函数。像这样。

@login_manager.user_loader
def load_user(userid):
# Check if user is root
if userid == "root":
return User(userid, 1)
else:
return None

这是修改后的 login_required 函数:

# login_required function
# This is an improvement over flask-login's login_required
# This implementation supports clearance levels
# A route can be accessed by anyone having a clearance level less than the
# set clearance level
def login_required(clearance="100"):
def wrapper(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
if not current_user.is_authenticated():
return login_manager.unauthorized()
u_clearance = login_manager.reload_user().get_clearance()
if (u_clearance > clearance):
return login_manager.unauthorized()
return fn(*args, **kwargs)
return decorated_view
return wrapper

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