如何在 AWS Lambda 中最好地使用 Python 3 的 mimetypes 模块?

问题描述 投票:0回答:2

我通过 Zappa 将一个工作 Flask 应用程序部署到 AWS Lambda。在本地工作但在 Lambda 上不起作用的事情之一是调用

mimetypes.guess_extension

特别是,在本地,在我的 Mac 上,猜测的扩展名是

application/vnd.openxmlformats-officedocument.wordprocessingml.document

是正确的

.docx

但在 Lambda 上,它是

None

mimetypes
的工作方式是查阅主机的
mime.types
文件,而这个文件要么在Lambda上不存在,要么存在但类型不多。

那么如何让这个模块在 Lambda 上工作呢? documentation 提到了模块中接受文件的

init
函数,但这对于 Lambda 来说似乎不合适。我猜我可以将 Mac 上的整个 48K mime.types 文件捆绑到我部署的 Lambda 中(作为一个文件?),但这似乎有点矫枉过正,我想知道我是否错过了一些东西,并且 Lambda 应该 有权访问无需上传文件即可获取此信息?

我检查了 PyPI,发现了包

mime
common-mimetypes
,但它们已经很多年没有被碰过了。

我在这里忽略了哪些最佳实践?

python amazon-web-services aws-lambda mime-types
2个回答
1
投票

我认为基于AWS lambda的结构,它不会包含你想要的或者至少是你想要的全部。

我建议将文件上传到某些云存储(例如 s3 存储),而不是将文件上传到 lambda。并使用该文件初始化您的程序,而不将其存储在磁盘上。

mime = MimeTypes()
with requests.get(url) as res:
    mime_file = BytesIO(res.content)
mime.readfp(mime_file)

mime.guess_extension("application/vnd.openxmlformats-officedocument.wordprocessingml.document")

0
投票

我也遇到了这个问题,并且更喜欢以下步骤。鉴于 mime.types 文件为 61KB,相对于我正在安装的其他软件包等来说,这并不是一个很大的空间。

  1. 在笔记本电脑上找到 mime.types 文件。我的在
    /etc/apache2/mime.types
    。要检查的一个很好的文件列表是
    mimetypes.knownfiles
    列表,在我的机器上是:
['/etc/mime.types', '/etc/httpd/mime.types', '/etc/httpd/conf/mime.types', '/etc/apache/mime.types', '/etc/apache2/mime.types', '/usr/local/etc/httpd/conf/mime.types', '/usr/local/lib/netscape/mime.types', '/usr/local/etc/httpd/conf/mime.types', '/usr/local/etc/mime.types']
  1. 将该文件复制到您的 Lambda(我正在从 ECR 上托管的 Docker 映像构建我的 Lambda,因此我只是将
    COPY mime.types /etc/mime.types
    添加到该 Dockerfile)。
  2. [可选] 如果您能够将文件复制到
    knownfiles
    位置之一(例如
    /etc/mime.types
    ),则您已完成。如果没有,请确保在需要 mimetypes 类型推断的文件中调用
    mimetypes.init(files=[<filename>])
    ,其中
    <filename>
    是 mimetype 文件位置的路径。
© www.soinside.com 2019 - 2024. All rights reserved.