在我的django项目中,我得到了以下urls.py
的{{1}}:
urlpattern
在url(r'^$', views.index, name="index")
的{{1}}函数中,我得到了:
views.py
现在,index()
文件看起来很棒。问题是html代码中的相对路径(包括子目录)不会显示,即使它们与template = loader.get_template('stats/index.html')
context = RequestContext(request, {...})
return HTTPResponse(template.render(context))
存在于同一文件夹中。
我该怎么办?
答案 0 :(得分:1)
想一想有关相对路径的意思。
我们假设我有一个本地html文件/users/me/mysite/index.html
。该文件看起来像:
<html>
<body>
<img src="foo.jpg" />
</body>
</html>
浏览器正在提取图像。它对磁盘上的文件结构一无所知。那个src =并没有说&#34;和index.html一样在同一个目录中,&#34;它说&#34;查看与index.html相同的父URL,&#34;或/users/me/mysite/foo.jpg
。区别在于这是一个URL,而不是一个路径(虽然它看起来像一个)。
那么Django是如何工作的? Django不提供文件。您的网址可能与/index.html
完全不同 - 实际上它是!在您的情况下,它只是站点根目录。
所以,让我们说你只使用相对路径src="foo.jpg"
- 你要求服务器提供localhost / foo.jpg。但是你没有一个描述foo.jpg是什么的URL。 Django甚至不知道在哪里看!
STATIC_ROOT
,STATIC_URL
和STATICFILES_DIRS
来玩。 STATIC_URL
表示我会在哪个URL根目录中找到模板中静态标记引用的静态文件?&#39;。 STATICFILES_DIRS
是存储静态文件(如CSS和JS)的本地目录列表。您也可以在此处存储图像,但请谨慎使用 - 有时您希望从应用程序服务器提供图像,有时您需要单独的介质服务器,有时候你需要一个完整的CDN来支持你所服务的大量图像(有MEDIA_URL
和MEDIA_ROOT
选项,可以将普通代码(css,js)与媒体(图像,视频)分开)。
所以,让我们举个例子。在我的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/'
也就是说,当我运行&#39; manage.py collectstatic&#39;所有我的静态文件,来自所有应用程序,在我的项目根目录中被拖入static_files - 在部署中,我有nginx指向该目录专门用于根据对/ static /的请求提供静态文件。您似乎还没有部署,所以不要担心或收集静态 - 开发服务器会为您处理。
现在,当我运行服务器时,链接将呈现为
<link href="/static/ui/css/base.css" rel="stylesheet">
和http://localhost:8000/static/ui/css/base.css
由开发服务器自动提供!在生产中,/ static / url由nginx提供,而不是转发到应用服务器。