我正在使用flask_login管理器来登录用户,如here所述,但是,当调用user_loader回调时,flask会抛出错误:TypeError:必须使用User实例作为第一个参数调用unbound方法get_id()(获取int实例)我有尝试用数据库调用替换User.get_id(user_id)以返回user_loader回调中的对象,但是,生成错误AttributeError:'Query'对象没有属性'is_authenticated'。对我在这里做错了什么都有帮助。
LoginManager的Flask包
from flask_login import LoginManager,
UserMixin, login_user, login_required,
logout_user, current_user
我的用户类:
class User(Base, UserMixin):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
username = Column(String(32), index=True)
hash_password = Column(String(80))
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return unicode(self.id)
def __repr__(self):
return '<User %r>' % (self.username)
@property
def serializable(self):
return {'id': self.id, 'username': self.username}
我的登录功能
app = Flask(__name__)
bootstrap = Bootstrap(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
@app.route('/login/', methods=['GET', 'POST'])
def showLogin():
form = LoginForm()
if form.validate_on_submit():
user = session.query(User).filter_by(username=form.username.data).first()
if user is not None:
if check_password_hash(user.hash_password, form.password.data):
login_session['username'] = user.username
login_session['user_id'] = user.id
login_user(user)
flash('Your Are Now Logged In')
return redirect(url_for('showCatalog'))
else:
flash('Username Or Password Invalid')
return redirect(url_for('showLogin'))
return render_template('login.html', form=form)
@login_manager.user_loader
def load_user(user_id):
return User.get_id(user_id)
堆栈跟踪
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1997, in
__call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1985, in
wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1540, in
handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1982, in
wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1614, in
full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1517, in
handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1612, in
full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1598, in
dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python2.7/dist-packages/flask_login/utils.py", line
259, in decorated_view
elif not current_user.is_authenticated:
File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 347,
in __getattr__
return getattr(self._get_current_object(), name)
File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 306,
in _get_current_object
return self.__local()
File "/usr/local/lib/python2.7/dist-packages/flask_login/utils.py", line 26,
in <lambda>
current_user = LocalProxy(lambda: _get_user())
File "/usr/local/lib/python2.7/dist-packages/flask_login/utils.py", line
335, in _get_user
current_app.login_manager._load_user()
File "/usr/local/lib/python2.7/dist-packages/flask_login/login_manager.py",
line 359, in _load_user
Open an interactive python shell in this framereturn self.reload_user()
File "/usr/local/lib/python2.7/dist-packages/flask_login/login_manager.py",
line 321, in reload_user
user = self.user_callback(user_id)
File "/vagrant/finalproject/webserver.py", line 193, in load_user
return User.get_id(user_id)
TypeError: unbound method get_id() must be called with User instance as
first argument (got int instance instead)
User的get_id方法期望User实例作为第一个且唯一的参数:
def get_id(self):
并且您将user_id传递给它。那个例外的解释。
但我想从db获取用户对象?尝试:
User.query.filter(User.id == user_id).first()
这解决了我的两个错误问题。
用户加载器(修改)
@login_manager.user_loader
def load_user(user_id):
user = session.query(User).filter_by(id=user_id).first()
if user is not None:
return user
else:
return None