Я новичок в Flask. Я пытаюсь создать фляжное приложение для местной группы сообщества, где они могут добавлять комментарии и организовывать мероприятия или поддержку. Я создал систему входа в систему (используя онлайн-ресурсы) и установил flask-admin, поэтому есть обзор входящих сообщений.
Я хочу ограничить доступ к панели администратора, чтобы только тот, кто является администратором, мог видеть все сообщения/сообщения. Некоторые сообщения могут быть конфиденциальными.
Я подумал, что для этого подойдет базовая аутентификация. Я исследовал модель данных для ролей фляг, чтобы я мог назначить роль администратора и «остальное». (Мне просто нужен один пользователь-администратор), и я пошел дальше и создал то, что я считал разумной моделью, в которой класс пользователя имеет класс 1: M с классом сообщений и класс M: M с классом ролей через класс userroles.
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))
Я застрял в течение нескольких дней, пытаясь заставить это работать. Я исследовал множество различных способов заставить его работать, но все время получаю одно и то же сообщение об ошибке. Любые идеи? Я полностью лаю не на то дерево? Когда я захожу в интерфейс командной строки python и использую «модели импорта из flaskblog», это сообщение об ошибке.
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.