Database 蓝图和用户模型
我最近开始玩flask,为此我开发了一个小沙盒web应用程序,它将作为我想到的其他项目的容器。到目前为止,我专注于实现一个用户系统,我觉得一切似乎都在工作。我还实现了我的用户角色控制版本 现在我想开始开发web应用程序的其他方面。比如说,我想开发一个博客,我自己的图像存储,我的一群朋友的成就系统,等等。我的意图是对所有子应用程序使用相同的用户模型,我一直在尝试绘制这种关系的样子,但是我没有想到任何不同,然后将它们全部添加到我的主用户类中。我担心的是,这样做会导致用户类太大,附加了很多关系;此外,并非每个用户都可以访问/需要每个子应用程序 是否有更好的方法将我的用户与其他子应用程序“链接” 文件结构 用户类 例如,如果我要添加一个微博,我会这样做: 1.在blog_blupprint/models.py创建必要的模型 2.然后将关系添加到用户模型中Database 蓝图和用户模型,database,flask,flask-sqlalchemy,Database,Flask,Flask Sqlalchemy,我最近开始玩flask,为此我开发了一个小沙盒web应用程序,它将作为我想到的其他项目的容器。到目前为止,我专注于实现一个用户系统,我觉得一切似乎都在工作。我还实现了我的用户角色控制版本 现在我想开始开发web应用程序的其他方面。比如说,我想开发一个博客,我自己的图像存储,我的一群朋友的成就系统,等等。我的意图是对所有子应用程序使用相同的用户模型,我一直在尝试绘制这种关系的样子,但是我没有想到任何不同,然后将它们全部添加到我的主用户类中。我担心的是,这样做会导致用户类太大,附加了很多关系;此外,
谢谢你的帮助!所有用户都可以访问所有子应用程序吗?您好@supershot,谢谢您的关注和时间!不,他们不会。我的想法是,用户只能访问对他有用的子应用程序。所有用户都可以访问所有子应用程序吗?您好@supershot,谢谢您的关注和宝贵的时间!不,他们不会。我的想法是,用户只能访问对他有用的子应用程序。
-- 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)