Я недавно начал играть с flask, и для этого я разработал небольшое веб-приложение для песочницы, которое будет служить контейнером для других проектов, которые я имею в виду.До сих пор я сосредоточился на реализации пользовательской системы, и мне кажется, что все работает.Я также реализовал свою версию управления ролями пользователей.
Теперь я хочу начать разрабатывать другие аспекты веб-приложения.Скажем, например, я хочу создать блог, свое собственное хранилище изображений, систему достижений для группы моих друзей и т. Д. Я намерен использовать одну и ту же модель пользователя для всех субприложений, и я былпытаюсь нарисовать, как будут выглядеть такие отношения, но я не думал о чем-то ином, чем просто добавлял их в свой основной класс User.Меня беспокоит то, что таким образом класс User окажется слишком большим со многими связанными связями;кроме того, не у каждого пользователя будет доступ / потребность для каждого из вложенных приложений.
Есть ли лучший способ "связать" моего пользователя с другими вспомогательными приложениями?
Структура файла
-- MyApp
-- auth_blueprint
-- forms.py
-- routes.py
-- models.py
-- utils.py
-- achievements_blueprint
-- forms.py
-- routes.py
-- models.py
[static, templates, etc]
Класс пользователя
from myapp import db, login_manager
from flask_login import UserMixin
from flask import url_for
from random import randint
from os import listdir
__PROFILE_PICS_PATH = 'myapp/static/media/img/profile_pics/'
def new_profile_pic():
pics = listdir(__PROFILE_PICS_PATH)
if '.DS_Store' in pics:
pics.remove('.DS_Store')
n_pics = len(pics)
return '/static/media/img/profile_pics/'+ str(randint(1, n_pics)) +'.png'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
# Define a base model for other database tables to inherit
class Base(db.Model, UserMixin):
__abstract__ = True
id = db.Column(db.Integer, primary_key=True)
date_created = db.Column(db.DateTime, default=db.func.current_timestamp())
date_modified = db.Column(db.DateTime, default=db.func.current_timestamp(),
onupdate=db.func.current_timestamp())
# Define a User model
class User(Base):
__tablename__ = 'users'
first_name = db.Column(db.String(20), nullable=False, default='First Name')
last_name = db.Column(db.String(30), nullable=False, default='Last Name')
email = db.Column(db.String(120), unique=True, nullable=False)
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
image_file = db.Column(db.String(20), nullable=False, default=new_profile_pic())
# Define the relationship to Role via UserRoles
roles = db.relationship('Role', secondary='user_roles')
def __repr__(self):
return f"User('{self.username}','{self.email}','{self.image_file}')"
def has_roles(self, role_names):
return len([role for role in self.roles if role.name in role_names])
# Define the Role data-model
class Role(Base, db.Model):
__tablename__ = 'roles'
name = db.Column(db.String(50), unique=True)
# Define the UserRoles association table
class UserRoles(Base, db.Model):
__tablename__ = 'user_roles'
user_id = db.Column(db.Integer(), db.ForeignKey('users.id', ondelete='CASCADE'))
role_id = db.Column(db.Integer(), db.ForeignKey('roles.id', ondelete='CASCADE'))
Если бы я добавил, например, мини-блог, я бы сделал следующее:
-- MyApp
-- blog_blueprint
-- forms.py
-- routes.py
-- models.py
[etc]
1.Создайте необходимые модели в blog_bluprint / models.py
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
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)
2.А затем добавьте отношение к модели User
posts = db.relationship('Post', backref='author', lazy=True)
Спасибо за любую помощь!