Django中的相关文件

时间:2013-06-26 17:38:11

标签: django

在我的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)) 存在于同一文件夹中。

我该怎么办?

1 个答案:

答案 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甚至不知道在哪里看!

幸运的是,他们虽然如此。 Here is the link to the docs for the static files app,详细描述了系统。要点是你在settings.py中有一些设置可以使用:STATIC_ROOTSTATIC_URLSTATICFILES_DIRS来玩。 STATIC_URL表示我会在哪个URL根目录中找到模板中静态标记引用的静态文件?&#39;。 STATICFILES_DIRS是存储静态文件(如CSS和JS)的本地目录列表。您也可以在此处存储图像,但请谨慎使用 - 有时您希望从应用程序服务器提供图像,有时您需要单独的介质服务器,有时候你需要一个完整的CDN来支持你所服务的大量图像(有MEDIA_URLMEDIA_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/staticui/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提供,而不是转发到应用服务器。