我目前正在使用Flask-Login进行身份验证,但我收到了一个错误,即load_user() missing 1 required positional argument: 'user_id'
,但当我调试我的应用程序时,user_id存在并且被正确地传递到login_user()
函数中(并存储在session['user_id']
变量中)。
下面是我的代码,用于让用户登录,然后导航到主页:
@app.route('/', methods=['GET', 'POST'])
def login():
login_form = LoginForm()
username = login_form.username.data
password = login_form.password.data
if user_details_valid(username, password):
login_user(user_service.get_user_object(username))
return redirect(url_for(‘home’))
return render_template('login.html', form=login_form)
@app.route(‘/home’)
@login_required
def home():
return render_template(“home.html")
用户模型如下:
class User(UserMixin):
def __init__(self, username):
self.username = username
self.email = None
self.password = None
self.user_id = None
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return str(self.user_id)
def set_id(self, user_id):
self.user_id = user_id
def set_password(self, password_hash):
self.password = password_hash
def set_email(self, email):
self.email = email
我得到的堆栈跟踪是:
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_login.py", line 756, in decorated_view
elif not current_user.is_authenticated():
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/werkzeug/local.py", line 347, in __getattr__
return getattr(self._get_current_object(), name)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/werkzeug/local.py", line 306, in _get_current_object
return self.__local()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_login.py", line 46, in <lambda>
current_user = LocalProxy(lambda: _get_user())
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_login.py", line 794, in _get_user
current_app.login_manager._load_user()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_login.py", line 363, in _load_user
return self.reload_user()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_login.py", line 325, in reload_user
user = self.user_callback(user_id)
TypeError: load_user() missing 1 required positional argument: 'user_id'
我的user_loader在user_service类中,如下所示:
@login.user_loader
def load_user(self, user_id):
return self.collection.find_one({"user_id": user_id})
发布于 2020-04-20 04:14:35
我得到了同样的错误。在初始化LoginManager时,我忘记了将应用程序的实例作为参数传递。
app/初始化.py
#...
from flask_login import LoginManager
app = Flask(__name__)
# ...
login = LoginManager(app)
发布于 2018-03-07 02:55:46
为了解决这个错误,我将user_loader
放在__init__.py
文件中,如this youtube tutorial中所示。
然而,这并不是一个完美的答案,因为无论是Miguel's guide、RealPython guide还是RunningCodes flask-login pymongo guide都没有显示这种情况,事实上,米格尔的指南和RunningCode的指南都特别在应用程序的不同部分提供了user_loader
。
这个解决方案没有意义,因为我必须从我的__init__.py
内部访问我的数据库,这看起来非常混乱,但我能够修复错误并正确登录。
错误的发生可能是因为我的__init__.py
似乎加载了两次,我在某个地方找到了另一个答案,所以说明了由于应用程序运行的两个实例而导致的类似错误。
https://stackoverflow.com/questions/49097612
复制相似问题