django staticfiles 在 url 根

Posted

技术标签:

【中文标题】django staticfiles 在 url 根【英文标题】:django staticfiles at url root 【发布时间】:2012-06-29 06:45:10 【问题描述】:

我有一个关于新的 Django 1.3 静态文件框架的一般性问题。

我真的很喜欢 Django 1.3 中引入的新 Django 静态文件功能。通常,我设置 STATIC_URL="/static/" 并将 STATIC_URL 模板标签输入到我的模板中。开发服务器如何自动提供静态文件并且我的所有内容都按预期提供,这很棒。

The  STATIC_URL  would be substituted in the template and might serve up files like this...
example.com/static/css/master.css
example.com/static/images/logo.png
example.com/static/js/site.js

但是,我正在使用静态媒体安装在 url 根目录的旧网站。例如,静态 url 的路径可能如下所示:

example.com/css/master.css
example.com/images/logo.png
example.com/js/site.js 

它不使用“静态”url 命名空间。

我想知道是否有办法让新的静态文件功能不使用静态命名空间并提供上面的 url,但仍然保留新静态文件框架的好处(收集静态、开发服务器提供的静态文件等) )。我尝试设置 STATIC_URL="" 和 STATIC_URL="/",但似乎都没有达到预期的效果。

有没有办法配置静态文件以在没有命名空间的情况下提供静态文件?感谢您的考虑。

【问题讨论】:

【参考方案1】:

您可以手动添加项目中static 目录中不存在的额外位置:

urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
)

if settings.DEBUG:
    urlpatterns += static('/css/', document_root='app_root/path/to/css/')
    urlpatterns += static('/images/', document_root='app_root/path/to/images/')
    urlpatterns += static('/js/', document_root='app_root/path/to/js/')

这将为 DEBUG 开发服务器映射媒体。当您运行生产模式服务器时,您显然会从 Web 服务器处理这些静态位置,而不是将请求发送到 django。

【讨论】:

感谢 jdi。在模板中,我还是 STATIC_ROOT 还是将其保留为 /css/、/images/、/js/....? 它将不再是静态应用程序的一部分,因为它无法通过python manage.py collectstatic 收集。您只需使用这样的普通网址:/css/foo.css。这些是从各个位置明确提供的。它们甚至可以存在于 django 项目空间之外。 document_root 不应该以'/'开头,你必须指定你的django项目的根目录,例如:urlpatterns += static('/css/', document_root='app_root/path/to/css/')【参考方案2】:

为什么不保留静态文件功能,而只是在 Web 服务器级别使用重写来提供内容。

例如:

rewrite /css /static permanent; (for nginx) 

这将使您的项目目录更加整洁,并且使您将来可以更轻松地移动静态目录,例如将您的 STATIC_URL 移动到 CDN。

【讨论】:

【参考方案3】:

这是您如何设置 urls.py 以在 Django 1.10 上同时为 index.html 和其他静态文件提供服务(同时仍然能够为其他 Django 视图提供服务):

from django.contrib.staticfiles.views import serve
from django.views.generic import RedirectView

urlpatterns = [

    # / routes to index.html
    url(r'^$', serve,
        kwargs='path': 'index.html'),

    # static files (*.css, *.js, *.jpg etc.) served on /
    url(r'^(?!/static/.*)(?P<path>.*\..*)$',
        RedirectView.as_view(url='/static/%(path)s')),
]

请参阅this answer,我在其中对此类配置进行了更完整的解释——尤其是如果您想将其用于生产。

【讨论】:

以上是关于django staticfiles 在 url 根的主要内容,如果未能解决你的问题,请参考以下文章

/'staticfiles' 处的 Django TemplateSyntaxError 不是已注册的标签库。必须是以下之一: admin_list admin_modify admin_urls

Django1.11加载静态文件

Django静态文件的处理

django中怎么载入css等静态文件

Django的静态文件的配置

Django--URL(路由层)