使用 Flask 权限 UserMixin 修改模型后,模型找不到外键关系



我正在使用Flask权限库来设置一些基本的权限系统。

在 User 类中,我将db.Model替换为 Flask-Permissions 中的UserMixin

一切都应该通过,但 SQLAlchemy 抛出错误

sqlalchemy.exc.NoForeignKeysError:找不到"fp_user"和"user"之间的任何外键关系。

这看起来不太好。我以为UserMixin已经继承了db.Model.

这是我当前的代码

Class User(UserMixin):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
first_name = db.Column(db.String(50), nullable=False)
last_name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(255), unique=True, nullable=False)
storage_hash = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255), nullable=False)
profile_picture = db.Column(db.String(255))
gender = db.Column(db.Enum('male', 'female', name='gender'))
registered_on = db.Column(db.Date, nullable=False)
last_activity = db.Column(db.DateTime)
role = db.Column(
db.Enum('student', 'teacher', 'secretary', 'debuty_director', 'director', 'supervisor', name='user_role'),
nullable=False)
credit = db.Column(db.Float, default=0)
school_id = db.Column(db.Integer, db.ForeignKey('school.id'), nullable=True)
file = db.relationship('File', backref='user', lazy='dynamic')
class_id = db.Column(db.Integer, db.ForeignKey('class.id'), nullable=True)
storage = db.relationship('UserStorage', uselist=False, backref='user')
payments = db.relationship('UserPayments', uselist=False, backref='user')
def __init__(self, first_name, last_name, email, password, school_id=None, role='student', gender='male'):
UserMixin.__init__(self, role)
self.first_name = first_name
self.last_name = last_name
self.email = email
self.storage_hash = strgen.StringGenerator('[wd]{20}').render()
os.mkdir(app.config['UPLOAD_FOLDER'] + self.storage_hash)
self.password = bcrypt.generate_password_hash(
password, app.config.get('BCRYPT_LOG_ROUNDS')
).decode('utf-8')
shutil.copy(app.config['IMAGES_FOLDER'] + 'resources/users/default_{}.png'.format(gender),
'{}/{}/'.format(app.config['UPLOAD_FOLDER'], self.storage_hash))
self.profile_picture = 'user_files/{}/default_{}.png'.format(self.storage_hash, gender)
self.gender = gender
self.registered_on = datetime.datetime.now()
self.role = role
self.school_id = school_id
storage = UserStorage()
db.session.add(storage)
db.session.commit()
self.storage_id = storage.id

为什么会出现此异常?

问题出在表名上。我的__tablename__设置为user,但在Flask-PermissionsUserMixin表中设置为fp_user。我必须删除表名或在库中替换它。

更好的选择是使用Flask-PermissionsSQLAlchemy-Permissions

我遇到了同样的问题。

pip install Flask-Permissions安装的版本已过时(2014(。UserMixin类已在 2016 年更新,以便您的User类可以继承它。

相反,您应该安装 github 上可用的最新版本:pip install git+https://github.com/raddevon/flask-permissions.git

最新更新