我正在使用Flask-Permissions库来设置一些基本权限系统。
在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('[\w\d]{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
为什么我会收到此异常?
答案 0 :(得分:0)
问题在于tablename。我的__tablename__
设置为user
,但在Flask-Permissions
UserMixin
表中设置为fp_user
。我必须删除表名或将其替换为库。
更好的选择是使用Flask-Permissions
SQLAlchemy-Permissions
答案 1 :(得分:0)
我遇到了同样的问题。
pip install Flask-Permissions
安装的版本已过时(2014)。 UserMixin
类已于2016年更新,因此您的User
类可以继承它。
相反,您应该安装github上可用的最新版本:
pip install git+https://github.com/raddevon/flask-permissions.git