Django开发服务器和MIME类型

13

在Django开发服务器中是否有设置MIME类型的方法?具体而言,我想从Chrome开发工具警告中删除此消息。

Resource interpreted as Image but transferred with MIME type image/x-png
3个回答

26
原来解决方案就是添加以下内容。
if DEBUG:
    import mimetypes
    mimetypes.add_type("image/png", ".png", True)

到settings.py文件中


4
我在使用 Django 自带服务器时遇到了一个问题,它将 JavaScript ES6 模块作为文本/plain 来提供,而这个问题被以下解决了(通过设置 "application/javascript" 和 ".js")。 - Alexandre Cox
这里也有同样的问题。但只有在将ES模块文件包含在主项目静态目录中时才有效。任何在应用程序目录中提供的.js文件都会被赋予text/html的内容类型 :-( - timbo

4

Django开发服务器使用 mimetypes 模块来猜测任何给定文件的适当MIME类型,而在内部,该模块根据您的操作系统使用不同的配置。

特别是在Windows上,它从注册表中的 HKEY_CLASSES_ROOT 加载内容类型(例如对于 .js 文件的键 HKEY_CLASSES_ROOT\.js\Content Type),似乎这个配置经常以意想不到的方式进行设置(例如通过文本编辑器打开javascript文件)- 它甚至不是Python或Django特有的问题,因为 Go也使用注册表并受到相同影响

修改受影响文件扩展名的注册表键应该可以解决此问题,而不需要进行任何Django设置更改(但这是一个系统范围的配置更改,可能不是理想的方法):

Windows Registry Editor Version 5.00

; Fixing the question's issue with PNG
[HKEY_CLASSES_ROOT\.png]
"Content Type"="image/png"

; Fixing a common problem with Javascript files
[HKEY_CLASSES_ROOT\.js]
"Content Type"="text/javascript"

在其他操作系统中,MIME映射是在一个大多数用户不会修改的文件中配置的,因此这不是一个问题。但是如果需要,mimetypes.knownfiles是一个包含MIME类型映射的路径列表,可以根据需要进行编辑。

@它在EDGE浏览器中有所帮助,但由于某些有趣的原因,在Opera浏览器中不起作用。 Windows... - Aleksei Khatkevich

0

2020年解答:

如果您希望任何MIME内容类型能够被浏览器自动检测,则这是解决方案。

在多次痛苦的失败静态尝试之后,这是动态解决方案。

def fetch(request):
    import mimetypes
    clientRequestUrl=os.getcwd()+'/servlet'+request.path
    try: return HttpResponse(fread(clientRequestUrl), content_type=mimetypes.guess_type(request.path)[0])
    except Exception as e: return HttpResponse(str(e)+'===> Error Thrown <br>')
  • fread()函数直接读取文件,在try except块中只是一个I/O包装器。
  • content_type=mimetypes.guess_type(request.path)[0]执行MIME检测魔法[0],即第一个元素是必需的,因为它返回一个元组,第一个是MIME类型,第二个是编码。
  • 上面一行中传递了request.path,因为它根据文件路径猜测MIME。例如,如果客户端(浏览器)请求名为stylesheet.css的文件,则为text/css。
  • clientRequestUrl =客户端尝试向服务器请求的确切URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接