谷歌应用引擎上的 mimetypes.mime_guess() 行为奇怪

Posted

技术标签:

【中文标题】谷歌应用引擎上的 mimetypes.mime_guess() 行为奇怪【英文标题】:mimetypes.mime_guess() on google app engine behaves strange 【发布时间】:2012-05-07 18:41:35 【问题描述】:

在我的 python shell 中,我可以做到

>>> import mimetypes
>>> mimetypes.guess_type("ulla.svg")
('image/svg+xml', None)

它的行为符合预期,但是,在谷歌应用引擎上运行相同的代码(或至少,这个相同的例子),它返回(None, None)

class TestHandler(webapp2.RequestHandler):
    def get(self):
        import mimetypes
        self.response.out.write(mimetypes.guess_type("ulla.svg"))

我做错了吗? :)

顺便说一句 - 在我的 macbooks shell 中是 python 2.7,在 app-engine 上也是 2.7

【问题讨论】:

我在使用 .docx、.xlsx、.webm 以及许多其他文件扩展名时遇到了同样的问题:guess_type 在开发环境中工作正常,在 Google App Engine 中返回 None。 我发现的解决方法是从 dev env 中获取 mimetypes.types_map 字典,并使用手工制作的 guess_type 函数在该字典上执行 get()。 【参考方案1】:

.svg 不包含在 mimetypes 模块中嵌入的默认 types_map 中:

>>> import mimetypes
>>> print '.svg' in mimetypes.types_map
False

mimetypes 模块从system files 添加额外的扩展/mimetypes,并且在/etc/mime.types 中的大多数发行版上都定义了svg

$ cat /etc/mime.types  | grep svg
image/svg+xml                   svg svgz

但不幸的是,它没有在 App Engine 沙箱中定义。

你应该在public issue tracker上填写一个缺陷

作为一种解决方法,您可以自己使用 mimetypes.add_type 注册 mimetype

>>> import mimetypes
>>> mimetypes.guess_type("ulla.svg")
(None, None)
>>> mimetypes.add_type("image/svg+xml", ".svg")
>>> mimetypes.guess_type("ulla.svg")
('image/svg+xml', None)

【讨论】:

感谢您的澄清和解决方法 :) - 但是,这真的算作缺陷吗? 我也可以被视为功能请求:)【参考方案2】:

您也可以直接编辑 C:\Python27\Lib\mimetypes.py:

types_map 字典中插入'.svg' : 'image/svg+xml'

信用:source

【讨论】:

以上是关于谷歌应用引擎上的 mimetypes.mime_guess() 行为奇怪的主要内容,如果未能解决你的问题,请参考以下文章

谷歌应用引擎上的xmpp可以将消息推送到javascript客户端吗

使用python的谷歌应用引擎上的xmpp错误

谷歌应用引擎上的 mimetypes.mime_guess() 行为奇怪

谷歌应用引擎中服务之间的延迟

谷歌电子表格和谷歌应用引擎如何实现交互

如何在应用引擎上实现谷歌风格的分页?