我最近开始玩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]
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)
posts = db.relationship('Post', backref='author', lazy=True)