Шаблоны проектирования для реализации API фляги
Я использую колбу с колбой-restplus и sqlalchemy.
Моя функция 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
Я готов добавить дополнительные данные в users
коллекция, которая должна быть возвращена 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()
# Add additional data
for user in users:
user.activity = UserActivity.query ... # from DB
user.online_status = "Active" # Taken somewhere from memory
return users
Очевидно, мне не нравится такой подход добавления данных к объекту User на лету. Но каков наилучший шаблон дизайна для его достижения?
0 ответов
Что касается шаблона проектирования, я рекомендую подход DAO и Service, вот хорошая и короткая статья об этом: https://levelup.gitconnected.com/structuring-a-large-production-flask-application-7a0066a65447
Что касается модели отношения "Пользователь / активность", я полагаю, что у вас есть сопоставленная модель активности. Если это отношение "один к одному", в модели User создайте поле activityId для поля FK и отношение активности, из которого ORM (я предполагаю, что SQLAlchemy) будет извлекаться при обращении к 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()