13

无论如何在 django 开发服务器中设置 MIME 类型?具体来说,我很想从 Chrome 开发工具的警告中删除此消息。

Resource interpreted as Image but transferred with MIME type image/x-png
4

3 回答 3

25

原来它就像添加一样简单

if DEBUG:
    import mimetypes
    mimetypes.add_type("image/png", ".png", True)

到 settings.py

于 2013-05-03T08:56:46.733 回答
3

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

特别是在 Windows 上,它从HKEY_CLASSES_ROOT注册表中加载内容类型(例如HKEY_CLASSES_ROOT\.js\Content Type.js 文件的键),并且似乎通常可以以您不期望的方式设置此配置(例如通过在文本编辑器中打开 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 类型映射的路径列表,可以根据需要进行编辑。

于 2020-09-24T22:59:55.360 回答
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 中读取文件,除了阻止它只是一个 I/O 包装器
  • content_type=mimetypes.guess_type(request.path)[0] 执行MIME检测魔术 [0] 即第一个元素是必需的,因为它返回一个元组,第一个是 mime 类型,第二个是编码。
  • request.path 在上面的行中传递,因为它根据文件路径猜测MIME 。例如,如果客户端(浏览器)请求,则为名为 stylsheet.css 的文件的 text/css。
  • clientRequestUrl = 客户端尝试向服务器请求的确切 url。
于 2020-10-18T04:53:18.840 回答