如何通过API封送pickled对象(最好使用flaskrestplus)?

2024-09-08 15:45:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个完整的API文档,它使用flaskrestplus在python3.5/flask中构建。我想添加一个功能块-返回一个pickled对象作为我的一个响应的一部分。在

不特定于flaskrestplus的通用解决方案是受欢迎的,但是由于我的API已经完全文档化并完成了(除了这一点),我宁愿把它挂在一边,而不是从根本上改变我正在使用的框架。在

我的模型架构如下(简化):

get_fields = api.model('get-myresource', {
    'id':                fields.Integer(description='Id of the resource.'),
    'other_field':       fields.Integer(description='some other fields too.'),
    'pickled_obj':       fields.Raw(description='Marshalling fields.Raw fails, as the serialised binary cant be expressed as json'),
})

以及一个示例类(将被pickle)和我想要形成api响应的模型:

^{pr2}$

api端点方法声明为:

import pickle
from flask import request
from flask_restplus import Resource, Namespace
from .my_schema_file import get_fields

api = Namespace('myresource', description='Whatever')

@api.route('')
class MyResource(Resource):

    @api.response(200, 'Resource(s) returned successfully', get_fields)
    @api.response(400, 'Bad Request')
    @api.response(404, 'Not Found')
    @api.response(500, 'Application Error')
    @api.marshal_with(get_fields, code=200, description='Resource(s) returned successfully')
    def get(self):

        # Argument parsing and fetch from the database
        data = MyDataModel()


        return data, 200

在这个例子中,我使用字段。原始()作为pickled对象的封送处理程序不起作用(没有json表示)。那么,我应该做些什么来尽量减少API框架的重组呢?在

[编辑:修复原始Q中的语法错误]


Tags: thefrom文档importapiflaskfieldsget
1条回答
网友
1楼 · 发布于 2024-09-08 15:45:21

最终答案:

最后,我们不再使用pickle,以避免在更新类时出现版本控制问题,然后尝试取消旧版本的pickle。在

我们最终使用了this SO answer中的建议,即使用jsonpickle库序列化任意类对象并将其从API中取出。在

相关问题 更多 >