1

在我的 django 项目中,我得到了以下内容urls.pyurlpattern

url(r'^$', views.index, name="index")

views.pyindex()函数中,我得到:

template = loader.get_template('stats/index.html')
context = RequestContext(request, {...})
return HTTPResponse(template.render(context))

现在,该index.html文件看起来很棒。问题是 html 代码中的相对路径(包括子目录)不会显示,即使它们与index.html.

我能做些什么?

4

1 回答 1

1

想一想相对路径的含义

假设我有一个本地 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_ROOTSTATIC_URLSTATICFILES_DIRSSTATIC_URL表示“我将在哪个 URL 根目录中找到模板中的静态标记引用的静态文件?”。STATICFILES_DIRS是您存储静态文件(如 CSS 和 JS)的本地目录列表。您也可以在此处存储图像,但请谨慎使用 - 有时您希望从应用程序服务器提供图像,有时您需要单独的媒体服务器,有时您需要在您提供的大量图像背后的整个 CDN(有一些选项可以将普通代码(css、js)与媒体(图像、视频)分开)MEDIA_URLMEDIA_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 提供,而不是转发到应用服务器。

于 2013-06-26T18:47:33.140 回答