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

Posted

技术标签:

【中文标题】如何设置通过 flask_restless 端点上传二进制对象?【英文标题】:How to setup uploading binary objects through flask_restless endpoint? 【发布时间】:2019-02-21 20:24:37 【问题描述】:

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

那么,有没有办法将使用flask_restless 管理的端点配置为接受二进制文件作为附件?或者更确切地说,建议的解决方案是直接使用烧瓶设置该特定表的端点(我之前在另一个应用程序中做过),远离flask_restless

【问题讨论】:

【参考方案1】:

事实证明,发送附件是不可能的。 因此,我深入研究了如何发送 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)

【讨论】:

以上是关于如何设置通过 flask_restless 端点上传二进制对象?的主要内容,如果未能解决你的问题,请参考以下文章

Python / Flask - 将 flask_restless 与 flask_httpauth 一起使用

使用 boost asio udp 套接字时如何设置本地端点

如何在 express 上创建一个从不响应的端点

如何在具有自动保存功能的网站上设计 api 端点?

aws vpc 端点 - 它是如何工作的?

如何在Windows Azure上用其它Web服务器