烧瓶API实现的设计模式

时间:2018-01-14 10:44:53

标签: python rest flask sqlalchemy flask-restplus

我正在使用带有flask-restplus和sqlalchemy的烧瓶。

我的rest API函数如下所示:

@ns.route('/user')
class UsersCollection(Resource):

    @jwt_optional
    @permissions.user_has('admin_view')
    @ns.marshal_list_with(user_details)
    def get(self):
        """
        Returns list of users.
        """

        users = User.query.all()

        return users

我愿意将额外的数据添加到应由API返回的users集合中。其中一些数据可能存储在其他数据库表中,而其他数据存储在内存中。

我通常做的是这样的事情:

@ns.route('/user')
class UsersCollection(Resource):

    @jwt_optional
    @permissions.user_has('admin_view')
    @ns.marshal_list_with(user_details)
    def get(self):
        """
        Returns list of users.
        """

        users = User.query.all()

        # Add additional data
        for user in users:
          user.activity = UserActivity.query ...  # from DB 
          user.online_status = "Active" # Taken somewhere from memory

        return users

显然,我不喜欢这种将数据动态添加到User对象的方法。但实现它的最佳设计模式是什么?

1 个答案:

答案 0 :(得分:0)

关于设计模式,我建议使用DAO和Service方法,这是一篇简短的文章: https://levelup.gitconnected.com/structuring-a-large-production-flask-application-7a0066a65447

关于模型用户/活动关系,我假设您有一个映射的活动模型。如果这是一对一关系,则在用户模型中为FK字段创建一个 activityId 字段,并为您的ORM(我假设为SQLAlchemy)创建一个 activity 关系。在访问 user.activity 时进行检索。

class Activity(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    descrption = db.Column(db.String(255))

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    activity = db.relationship(Activity)
    activityId = db.Column(db.Integer, db.ForeignKey(Activity.id))

如果您具有多对多关系,则必须创建一个名为 ActivityUser 的第三类来映射该关系

class ActivityUser(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    activity = db.relationship(Activity, lazy=True)
    user = db.relationship(User, lazy=True)
    activityId = db.Column(db.ForeignKey(Activity))
    userId = db.Column(db.ForeignKey(User))

,您可以像这样检索用户活动(再次假设您使用SQLAlchemy):

ActivityUser.query.filter(ActivityUser.userId == user.id).all()