我正在尝试使用Flask-User(包含Flask-Login)。我想使用@login_required
和@roles_required
装饰器来管理对路由的访问。但是,它不起作用。
Flask-User文档显示login_required
是从flask_user
而不是flask_login
导入的。从flask_login
导入时,它可以按预期工作,但是如果我将其切换为从flask_user
导入,则无法使用。相反,它表示未登录经过身份验证的用户。
为什么我不只是从flask_login
导入?好吧,我可以,但是那不能解决我的另一个问题,即只能从@roles_required
导入flask_user
,而且也不起作用(与上述问题相同-表示未登录经过身份验证的用户)。
我的设置在下面。如果有人可以帮助我,我将不胜感激。我以前曾让Flask User在另一个应用程序上工作,但无法弄清楚这里出了什么问题。目前,用户数据库存储在SQLite数据库中。
config.py
# Flask-User settings
USER_APP_NAME = "App name" # Shown in and email templates and page footers
USER_ENABLE_EMAIL = True # Enable email authentication
USER_ENABLE_USERNAME = False # Disable username authentication
USER_EMAIL_SENDER_NAME = USER_APP_NAME
USER_EMAIL_SENDER_EMAIL = "email"
USER_ENABLE_AUTH0 = True
USER_UNAUTHENTICATED_ENDPOINT = "login"
USER_UNAUTHORIZED_ENDPOINT = "login"
__ init __。py
# Initialise flask_login
login = LoginManager(app)
login.login_view = 'login'
login.refresh_view = "login"
login.needs_refresh_message = "Please sign in again to access this page"
models.py
from andon import db, app, login
from flask_user import UserMixin, UserManager
from flask_login import current_user
@login.user_loader
def load_user(id):
return User.query.get(int(id))
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
# User Authentication fields
email = db.Column(db.String(255), nullable=False, unique=True)
email_confirmed_at = db.Column(db.DateTime())
password = db.Column(db.String(255), nullable=False)
# User fields
active = db.Column(db.Boolean())
first_name = db.Column(db.String(50), nullable=False)
last_name = db.Column(db.String(50), nullable=False)
registered = db.Column(db.DateTime, default=datetime.utcnow)
last_login = db.Column(db.DateTime)
client_id = db.Column(db.Integer, db.ForeignKey('client.id', ondelete='CASCADE'))
login_count = db.Column(db.Integer, default=0)
invitation_token = db.Column(db.String(50))
roles = db.relationship('Roles', secondary='user_roles')
def check_password(self, password):
# Check password against hash; return True or False
return bcrypt.checkpw(password.encode('utf8'), self.password)
# Define the Role data model
class Roles(db.Model):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(50), nullable=False, unique=True) # for @roles_accepted()
def __repr__(self):
return self.name
# Define the UserRoles association model
class UserRole(db.Model):
__tablename__ = 'user_roles'
id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
role_id = db.Column(db.Integer(), db.ForeignKey('roles.id', ondelete='CASCADE'))
# Setup Flask-User
user_manager = UserManager(app, db, User)
main.py
from flask_login import current_user, login_user, logout_user
from flask_user import roles_required, login_required
@app.route('/test')
@login_required
def register_hub():
return "Test"
flask-user
在这种情况下不会引发描述性错误,而只是说用户未登录。因此,解决方法:设置USER_ENABLE_EMAIL = False
,除非您要在用户访问@login_required
路由之前强制进行电子邮件验证。