Django:动态生成JS是一个好主意吗?

9
当我为Django项目编写JS文件时,我会做一些AJAX调用,目前这些调用的URL是硬编码的(非常丑陋)。
我在考虑让Django服务于JS文件(而不是Apache),这样我就可以利用模板标签({% url %}!!!)。
是否有任何阻止我这样做的原因?
或者是否有正确的方法来做到这一点?
(我至少可以提供一个:重新发送未更改的JS文件会消耗大量时间。最好的方法是创建一个应用程序,在重启Django服务器时生成文件,然后静态地提供它们!)
5个回答

12

我会选择混合技术。大部分JavaScript代码静态提供。但是在Django模板中,使用<script>块定义各种全局变量,这些变量由服务器端代码生成,例如url。然后,静态JS可以引用在动态代码中生成的变量。


这也是我所做的,但它的缺点是,如果您正在运行任何接受用户输入的内容,您将无法在内容安全策略中禁止不安全的内联脚本,因此您容易受到跨站脚本攻击。如果有更好的替代方案那就太好了。 - kloddant

7
我在djangopackages的资产管理应用程序中深入搜索后发现,django-mediagenerator提供了该功能,即使它没有很好地记录:您可以将您的js或css文件生成为django模板,然后以静态方式提供服务(它们也被捆绑在一起,并且缓存是由其管理等...因此一石二鸟+非常容易设置!)。
为了将JS文件生成为django模板(在设置了django-mediagenerator之后),只需添加过滤器:
ROOT_MEDIA_FILTERS = {
    'js': 'mediagenerator.filters.template.Template',
}

在您的设置中。

2
现在我更喜欢使用 django-compressor - sebpiq

4

在服务器上动态生成Javascript可以是一个非常强大的工具,我在我的项目中体验到了它的优势和劣势。

通常情况下,您希望尽可能多地保持静态以最小化每个请求要处理的工作量。这包括尽可能多地使用浏览器缓存,而这可能会成为您的问题。

我通常在我的基本模板中的头部添加一个块。在需要运行时自定义javascript的模板(例如基于已登录用户的自定义),我将其添加到该块中。在这里,我可以动态生成我知道不会被缓存的javascript,因此我可以做出一些假设。缺点是更复杂。

如果您需要的只是指向url或有一些简单的配置等,则建议创建一个视图,返回带有这些设置的Javascript文件。您可以设置正确的标头(Etag,Cache-Control等),以便浏览器将文件缓存一段合理的时间。当您升级代码时,请确保Etag将更改。

在需要使用配置的代码中,您需要始终检查您正在查找的变量是否实际定义,否则您将遇到难以调试的问题,当某些原因导致配置javascript未正确加载时。


0

发送到浏览器的 .js 文件可能会有所不同。这可能会使调试更加麻烦。也许不是问题,但需要考虑一下...


我不知道浏览器如何缓存js文件...但是你不觉得每次生成都会导致浏览器在每个请求时下载吗? - sebpiq
可能需要查看JS的HTTP缓存响应头。 - seand

0

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