3

docsで提案されているように、Marshmallowを使用したカスタム デシリアライザーを使用して、 Flask-Restless APIの列を除外しようとしています。

serializers.py

class HeatSchema(Schema):
    id = fields.Integer()
    heat_index = fields.Integer()
    updated_at = fields.DateTime()

class Meta:
    exclude = ('updated_at',)

def make_object(self, data):
    print 'Making object from', data
    return Heat(**data)

サーバー.py

from serializers import HeatSchema

heat_schema = HeatSchema()

def heat_serializer(instance):
    return heat_schema.dump(instance).data

def heat_deserializer(data):
    return heat_schema.load(data).data

apimanager = APIManager(app, flask_sqlalchemy_db=db)

apimanager.create_api(
    heat,
    methods=['GET'],
    url_prefix='/api/v1',
    collection_name='heat',
    results_per_page=10,
    serializer=heat_serializer,
    deserializer=heat_deserializer
)

Heat スキーマで何をしても、API からは同じ応答が得られます。私は置くことができます

blahblah = fields.Integer()

何も変更せずに。デバッグ中にシリアライザーのブレークポイントにヒットすることさえできないので、Flask-Restless でこの設定が間違っていると思いますか?

4

2 に答える 2

3

私も同じ問題を経験しました。GET_MANY 関数でのみ動作が発生するようです。単一のオブジェクト インスタンスを取得しようとする場合は、マシュマロ スキーマに準拠している必要があります。これは、Flask-restless バグ トラッカーで報告されている奇妙な動作です: https://github.com/jfinkels/flask-restless/issues/167

そこで、ユーザーitsrifatが、ポストプロセッサーを追加するための回避策を提供しました。


person_schema = PersonSchema()

def person_deserializer(data): return person_schema.load(data).data

def person_after_get_many(result=None, search_params=None, **kw): result['objects'] = [person_deserializer(obj) for obj in result['objects']]

apimanager.create_api(Person,methods=['GET', 'POST','PUT', 'DELETE'], postprocessors={ 'GET_MANY':[person_after_get_many] } )

于 2015-10-05T11:03:42.477 に答える
0

Meta クラスは Schema クラス内にあるはずです。

Meta: 構成がスキーマ クラスに追加される場所です。

 class HeatSchema(Schema):
     id = fields.Integer()
     heat_index = fields.Integer()
     updated_at = fields.DateTime()

     class Meta:
         exclude = ('updated_at',)

     def make_object(self, data):
         print 'Making object from', data
         return Heat(**data)
于 2016-06-15T15:58:20.917 に答える