蓝图和用户模型

时间:2019-09-20 17:24:38

标签: database flask flask-sqlalchemy

我最近开始玩flask,为此,我一直在开发一个小沙盒网络应用程序,该应用程序将用作我想到的其他项目的容器。到目前为止,我专注于实现用户系统,并且似乎一切正常。我还实现了我的用户角色控制版本。

现在,我想开始开发Web应用程序的其他方面。例如,假设我要开发一个博客,我自己的图像存储,一组朋友的成就系统等。我的意图是对所有子应用程序使用相同的用户模型,试图画出这种关系的样子,但是我没想到有什么不同,然后将它们全部添加到我的主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。然后将关系添加到用户模型

posts = db.relationship('Post', backref='author', lazy=True)

感谢您的帮助!

0 个答案:

没有答案