Чертежи и модель пользователя - PullRequest
1 голос
/ 20 сентября 2019

Я недавно начал играть с 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)

Спасибо за любую помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...