dlango staticfiles at url root

时间:2012-06-27 18:40:27

标签: css django static media django-staticfiles

我对新的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的路径可能如下所示:

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

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

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

有没有办法配置静态文件来提供没有命名空间的静态文件?谢谢你的考虑。

3 个答案:

答案 0 :(得分:4)

您可以手动添加项目中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。

答案 1 :(得分:2)

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

例如:

rewrite /css /static permanent; (for nginx) 

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

答案 2 :(得分:1)

这就是你如何设置你的 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我在哪里写了一个更完整的配置说明 - 特别是如果你想用它来制作。