我是Flask的新手。我正在尝试为本地社区组创建一个Flask应用程序,他们可以在其中添加评论并组织活动或支持。我已经创建了登录系统(使用在线资源),并且已经安装了flask-admin,因此有传入消息的概述。
我想限制对管理面板的访问,以便只有管理员用户才能看到所有帖子/消息。一些帖子可能是机密的。
为此,我认为使用basic-auth会很好。我研究了烧瓶角色的数据模型,以便可以分配管理员角色和“其余”角色。 (我只想要一个管理员用户),然后继续前进,并创建了我认为是合理的模型,其中用户类通过userroles类具有1:M的posts类和M:M的角色类
from datetime import datetime
from flaskblog import db, login_manager
from flaskblog import app
from flask_login import UserMixin
from flaskblog import routes
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from sqlalchemy.orm import relationship
admin = Admin(app, name='Dashboard')
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
class UserRoles(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('role.id', ondelete='CASCADE'))
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
password = db.Column(db.String(60), nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.email}', '{self.image_file}')"
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
date_related = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
user = relationship("User")
def __repr__(self):
return f"Post('{self.title}', '{self.date_posted},', '{self.date_related},')"
class Role(db.Model):
__tablename__ = 'role'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(50), unique=True)
admin.add_view(ModelView(User, db.session))
admin.add_view(ModelView(Post, db.session))
我已经被困了好几天试图使它起作用。我已经研究了许多使其工作的不同方法,但是我一直都想出同样的错误消息。有任何想法吗?我会完全吠错树吗?
sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class User->user'. Original exception was: Could not determine join condition between parent/child tables on relationship User.roles - there are no foreign keys linking these tables via secondary table 'user_roles'. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify 'primaryjoin' and 'secondaryjoin' expressions.
虽然这不是很关键,但我的建议是使角色成为用户的属性,而不是相反。因此,您将UserRoles更新为:
class UserRoles(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('role.id', ondelete='CASCADE'))
并且用户为:
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
password = db.Column(db.String(60), nullable=False)
roles = relationship("UserRoles")
并且角色为:
class Role(db.Model):
__tablename__ = 'role'
id = db.Column(db.Integer(), primary_key=True, db.ForeignKey(User.id))
name = db.Column(db.String(50), unique=True)
通过这种方式调用User对象时,可以通过调用“ roles”属性并遍历列表来访问其所具有的角色列表。
我认为应该解决未找到FK的问题。如果没有,请告诉我修改后的堆栈跟踪是什么。