首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flask-Login "load_user()缺少一个必需的位置参数:'user_id'“

Flask-Login "load_user()缺少一个必需的位置参数:'user_id'“
EN

Stack Overflow用户
提问于 2018-03-05 00:30:30
回答 2查看 3.2K关注 0票数 1

我目前正在使用Flask-Login进行身份验证,但我收到了一个错误,即load_user() missing 1 required positional argument: 'user_id',但当我调试我的应用程序时,user_id存在并且被正确地传递到login_user()函数中(并存储在session['user_id']变量中)。

下面是我的代码,用于让用户登录,然后导航到主页:

代码语言:javascript
运行
复制
@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")

用户模型如下:

代码语言:javascript
运行
复制
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

我得到的堆栈跟踪是:

代码语言:javascript
运行
复制
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类中,如下所示:

代码语言:javascript
运行
复制
@login.user_loader
def load_user(self, user_id):
    return self.collection.find_one({"user_id": user_id})
EN

回答 2

Stack Overflow用户

发布于 2020-04-20 04:14:35

我得到了同样的错误。在初始化LoginManager时,我忘记了将应用程序的实例作为参数传递。

app/初始化.py

代码语言:javascript
运行
复制
#...
from flask_login import LoginManager
app = Flask(__name__)
# ...
login = LoginManager(app)
票数 1
EN

Stack Overflow用户

发布于 2018-03-07 02:55:46

为了解决这个错误,我将user_loader放在__init__.py文件中,如this youtube tutorial中所示。

然而,这并不是一个完美的答案,因为无论是Miguel's guideRealPython guide还是RunningCodes flask-login pymongo guide都没有显示这种情况,事实上,米格尔的指南和RunningCode的指南都特别在应用程序的不同部分提供了user_loader

这个解决方案没有意义,因为我必须从我的__init__.py内部访问我的数据库,这看起来非常混乱,但我能够修复错误并正确登录。

错误的发生可能是因为我的__init__.py似乎加载了两次,我在某个地方找到了另一个答案,所以说明了由于应用程序运行的两个实例而导致的类似错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49097612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档