想一想相对路径的含义。
假设我有一个本地 html 文件,/users/me/mysite/index.html
. 该文件如下所示:
<html>
<body>
<img src="foo.jpg" />
</body>
</html>
浏览器是获取图像的东西。它对磁盘上的文件结构一无所知。src= 不是说“在与 index.html 相同的目录中查找”,而是说“与 index.html 查找相同的父 URL”或/users/me/mysite/foo.jpg
. 区别在于这是一个 URL,而不是路径(尽管它看起来像一个)。
那么Django是如何工作的呢?Django 不提供文件。/index.html
您的 URL 可能与- 事实上它是完全不同的!在您的情况下,它只是站点根目录。
因此,假设您只是使用相对路径src="foo.jpg"
- 您正在向服务器询问 localhost/foo.jpg。但是您没有描述 foo.jpg 是什么的 URL。Django 甚至不知道去哪里找!
幸运的是,他们已经想到了这一点。这是静态文件应用程序文档的链接,其中详细描述了系统。要点是您在 settings.py 中有一些设置可以使用:STATIC_ROOT
、STATIC_URL
和STATICFILES_DIRS
。STATIC_URL
表示“我将在哪个 URL 根目录中找到模板中的静态标记引用的静态文件?”。STATICFILES_DIRS
是您存储静态文件(如 CSS 和 JS)的本地目录列表。您也可以在此处存储图像,但请谨慎使用 - 有时您希望从应用程序服务器提供图像,有时您需要单独的媒体服务器,有时您需要在您提供的大量图像背后的整个 CDN(有一些选项可以将普通代码(css、js)与媒体(图像、视频)分开)MEDIA_URL
。MEDIA_ROOT
让我们举个例子。在我的 base.djhtml 模板中,我有
<head>
...
<link href="{% static "/static/ui/css/base.css" %}" rel="stylesheet">
...
</head>
在我的 settings.py 我有
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(SITE_ROOT, '..', 'MyApp/static'),
#'/Users/me/Development/Python/MyProj/MyApp/static',
)
当然/Users/me/Development/Python/MyProj/MyApp/static
还有ui/css/base.css
很多其他的好东西,比如 javascript
在设置中我也有
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = os.path.join(SITE_ROOT, '..', 'static_files')
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
也就是说,当我运行“manage.py collectstatic”时,所有应用程序中的所有静态文件都被打乱到我的项目根目录下的 static_files 中 - 在部署中,我让 nginx 专门指向该目录以根据请求提供静态文件/静止的/。您似乎还没有进行部署,所以不要担心这个或 collectstatic - 开发服务器会为您处理它。
现在,当我运行服务器时,链接被呈现为
<link href="/static/ui/css/base.css" rel="stylesheet">
并由http://localhost:8000/static/ui/css/base.css
开发服务器自动提供服务!在生产环境中,/static/ url 由 nginx 提供,而不是转发到应用服务器。