Начинаю потихоньку разбираться, как реализовывать REST API на Flask с помощью Flask-RESTplus. Сейчас просматриваю статьи и видео, в которых авторы используют в дополнение к Flask-RESTplus де/сериализатор Marshmallow. Один из первых же вопросов который стал передо мной это действительно ли необходимо дублировать код описания моделей?
Сейчас поясню, вот у нас есть описание моделей (де-факто описание таблиц в бд и их связей) SQLAlchemy, но это, как я понимаю, никак нам не поможет, ведь модели полученные через api.model() для использования в @api.expect() (может еще где, я пока не знаю), это больше сродни описанию форм из модуля Flask-WTF, так? Но если мы хотим использовать еще и Marshmallow в прикуску, то придется реализовывать дублирующее описание через Schema. Вот пример:
spoiler#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask_restplus import Resource, fields
from marshmallow import Schema, post_load, fields as ma_fields
from application import api
class MyModel(object):
def __init__(self, egg, spam):
self.egg = egg
self.spam = spam
def __repr__(self):
return 'Egg -> {} ; Spam -> {}'.format(self.egg, self.spam)
class MyModelSchema(Schema):
egg = ma_fields.String()
spam = ma_fields.String()
@post_load
def create_mymodel(self, data):
return MyModel(**data)
my_model = api.model('MyModel', {
'egg': fields.String('Put egg here'),
'spam': fields.String('Put spam here')})
fs = []
f1 = MyModel('egg1', 'spam1')
fs.append(f1)
@api.route('/hello')
class MyResource(Resource):
def get(self):
schema = MyModelSchema(many=True)
return schema.dump(fs)
@api.expect(my_model)
def post(self):
schema = MyModelSchema()
a = schema.load(api.payload)
fs.append(a.data)
return {'ok': 'all is fine'}, 201
И еще вопрос, существует модуль flask-marshmallow, может лучше использовать его?