【问题标题】:How to set content type of JavaScript files in Django如何在 Django 中设置 JavaScript 文件的内容类型
【发布时间】:2012-08-02 10:03:33
【问题描述】:

我有一个 Django 应用程序,它需要几个 JavaScript 文件。

在 Chrome 中,我收到错误“资源解释为脚本,但使用 MIME 类型文本/html 传输”。

AFAIK(参见2)为了解决这个问题,我需要配置 Django,以便 JavaScript 文件返回内容类型为“application/x-javascript”。

我如何在 Django 中做到这一点?

更新:我遵循 Daniel Roseman 的建议并找到了以下解决方案。

1) 修改urls.py:

urlpatterns = patterns('',
    ...
    url(r'.*\.js$', java_script),
    ...
)

2) 在views.py中添加如下函数:

def java_script(request):
    filename = request.path.strip("/")
    data = open(filename, "rb").read()
    return HttpResponse(data, mimetype="application/x-javascript")

【问题讨论】:

  • 我能很快找到最好的骗子,但实际上……您正在 Python 中设置标题和内容类型。 Django 与此 AFAIK 无关
  • stackoverflow.com/questions/3467404/… 有人说“这意味着服务器正在发送一个带有 content-type:text/plain 的 Javascript HTTP 响应。”。我正在使用 Django 的内置 Web 服务器(python manage.py runserver),因此我假设我必须配置 Django 的内置服务器来解决这个问题。
  • 我对 Python 或 Django 了解不多,无法评论该技术,但最后,您需要找到一种方法,当请求时,这些 uri 会给出正确的标头类型。如果 Django 有或需要,好吧,如果没有,是什么在提供这些文件?就是这个问题。
  • 在同一页面上,有人写道“AddType text/javascript .js”将解决 Apache 服务器上的问题(所有具有 .js 扩展名的文件都将具有“text/javascript”内容类型)。对于 Django 的内置 Web 服务器,我需要类似的东西。

标签: javascript django mime-types


【解决方案1】:

即使在我的 settings.py 中添加了@piephai 的解决方案后,我今天也遇到了这个错误。然后我注意到@Daniel Roseman 也做对了: 我的导入路径错误,我必须在所有路径中添加“.js”,例如:

import {HttpTool} from "./requests"; 变成了import {HttpTool} from "./requests.js";

在考虑如何生成静态文件的路由之后才有意义。

【讨论】:

    【解决方案2】:

    使用将以下代码放入主项目的 settings.py 来扩展 Alexandre 的答案。之后,您需要清除浏览器缓存(您也可以通过打开隐身窗口进行测试)以显示调试面板。

    if DEBUG:
        import mimetypes
        mimetypes.add_type("application/javascript", ".js", True)
    

    【讨论】:

      【解决方案3】:

      我在 Django 使用包含的服务器将 javascript 文件作为文本/纯文本提供时遇到了问题,这与 ES6 模块不太兼容。我发现 here 可以通过在 settings.py 中添加以下行来更改文件扩展名关联:

      #settings.py
      if DEBUG:
          import mimetypes
          mimetypes.add_type("application/javascript", ".js", True)
      

      JavaScript 文件现在以application/javascript 的形式提供。

      【讨论】:

        【解决方案4】:

        对于 Django,在视图中使用请求上下文:

        return render_to_response('success.html', {'object': varobject},context_instance=RequestContext(request))
        

        【讨论】:

          【解决方案5】:

          我怀疑问题不是你想的那样。实际可能发生的是根本没有提供您的 JS 文件:相反,正在发送 Django 错误页面。你需要弄清楚原因。

          【讨论】:

            【解决方案6】:

            既然这不会阻止浏览器正确解释脚本,为什么会出现这个问题? runserver 仅用于开发(而非生产用途),因此不是完整的 Web 服务器。

            您应该继续在开发中使用它,当您转移到生产环境时,请为静态文件适当地配置您的网络服务器。

            但是,如果您绝对必须使用开发服务器来提供静态文件;见how to serve static files

            【讨论】:

            • 1) 这是一个问题,因为我的 websocket 代码不起作用,并且出现在 Chrome 的“网络”控制台中的唯一错误消息是“Uncaught SyntaxError: Unexpected token
            • 该错误很可能与未正确返回 JSON 有关。
            • 如何在 Django 中以最少的努力修复它?
            • 修复返回 JSON 的视图,确保它设置了正确的 mimetype application/json,而不是 application/javascript
            猜你喜欢
            • 2018-10-07
            • 2023-02-25
            • 2022-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-28
            • 2014-09-11
            相关资源
            最近更新 更多