如何在Django页面中链接资源
假设我有一个HTML页面(base.html),它需要包含一个JavaScript文件。
<script type="text/javascript" src="/js/main.js"></script>
我了解到,Django项目并不是放在一个公开的文件夹里。相反,用户的请求会被发送到views.py
,然后这个文件会生成一个响应。
假设我的项目目录结构是这样的:
- project
- project_app
- views, models, ecc…
- templates
- base.html
- css
- main.css
- js
- main.js
那么,为什么base.html
可以引用main.css
和main.js
呢?如果我访问myserver.com/js/main.js
,应该不会返回任何内容(因为模板文件夹不是公开的)。但是浏览器需要访问这些文件,我也需要把它们包含进来。
我是否需要写一个特定的URL规则,把对/js/main.js
的请求重定向到实际的js文件,还是有什么特别的方式可以让简单的HTML包含工作呢?
2 个回答
你需要把所有的静态文件放到一个叫 STATIC_ROOT 的文件夹里。可以通过运行命令 django-admin.py collectstatic 来完成这个操作,然后再提供这个文件夹的服务。想要了解更多细节和解释,可以查看这里:
https://docs.djangoproject.com/en/dev/howto/static-files/#managing-static-files-css-images
通常的方法是把你的CSS、JavaScript和类似的文件放在一个叫做static
的文件夹里,然后在你的HTML中引用它们。你可以在这里找到Django的相关文档。
简单来说,你的文件夹结构大概是这样的:
- project
- project_app
- views, models, ecc…
- templates
- base.html
- static
- css
- main.css
- js
- main.js
接着,你的base.html
文件会用下面的方式来引用这些文件:
<script type="text/javascript" src="/static/js/main.js"></script>
我前面提到的文档说明了如何在生产环境中提供静态文件。很多人会使用内容分发网络(CDN)来提供他们的静态文件。比如,亚马逊的S3服务就是一个例子。然后,你需要在settings.py
文件中把STATIC_URL
的设置改成你的S3存储桶(或者类似的网络)。这样,你就可以在模板中引用STATIC_URL
了。
{% load static %}
...
<script type="text/javascript" src="{% static 'js/main.js' %}"></script>
...
你会使用像./manage.py collectstatic
这样的命令来收集你的静态文件,并在特定的时间把它们移动到你的CDN上。关于collectstatic
的基本信息可以在这里找到。