如何设置通过flask_restless端点上传二进制对象?

时间:2018-09-17 21:10:10

标签: file binary blob flask-sqlalchemy flask-restless

我正在研究REST python应用程序,并且选择了flask_restless来构建连接到数据库的端点。我要管理的表之一是将二进制文件存储为blob(LargeBinary)。 不过,我注意到flask_restless需要JSON数据才能进行POST请求。我试图将base64应用于二进制文件内容,并用json包装,但是最终flask_restless将文件内容作为字符串传递给sqlalchemy,SQLite后端抱怨它需要字节输入(非常正确)。 我尝试在互连网上搜索解决方案,但是或者我的查询公式不正确,或者实际上没有。

那么,有没有一种方法可以配置受flask_restless管理的端点以接受二进制文件作为附件?还是建议的解决方案是直接使用flask(而不是在另一个应用程序中这样做)直接从flask设置该特定表的端点,而远离flask_restless

1 个答案:

答案 0 :(得分:0)

事实证明,无法发送附件。 因此,我更深入地研究了如何发送base64编码的附件,然后将其另存为blob。

为此,我使用了flask_restless的预处理和后处理工具:

def pp_get_single_image(result=None, **kw):
    import base64
    result['image'] = base64.b64encode(result['image']).decode('utf8')

def pp_get_many_images(result=None, search_params=None, **kw):
    result['objects'] = [pp_get_single_image(d) or d for d in result['objects']]

def pp_post_image_in(data=None, **kw):
    import base64
    data['image'] = base64.b64decode(data['image'])

def pp_post_image_out(result=None, **kw):
    import base64
    result['image'] = base64.b64encode(result['image']).decode('utf8')

postprocessors=dict(GET_SINGLE=[pp_get_single_image], GET_MANY=[pp_get_many_images], POST=[pp_post_image_out])
preprocessors=dict(POST=[pp_post_image_in])

manager = flask_restless.APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Image, methods=['GET', 'POST', 'DELETE'],
               postprocessors=pp_image.postprocessors,
               preprocessors=pp_image.preprocessors)