2012-06-27 39 views
9

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

我非常喜欢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 =“/”,但都没有达到预期的效果。

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

回答

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。

+0

谢谢jdi。在模板中,我是否仍然{{STATIC_ROOT}}或将它保留为/ css /,/ images /,/ js/....? –

+0

它不再是静态应用程序的一部分,因为它不能通过'python manage.py collectstatic'收集。你只需要使用普通的URL:'/ css/foo.css'。这些都是从个别地点明确提供。它们甚至可以存在于django项目空间之外。 – jdi

+0

document_root不应以'/'开头,您必须指定django项目的根目录,例如:'urlpatterns + = static('/ css /',document_root ='app_root/path/to/css /' )' –

2

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

例如:

rewrite /css /static permanent; (for nginx) 

,这将让你的项目目录会更加清晰,也更容易地左右移动您的静态目录在未来,例如移动到您的STATIC_URL到CDN。

1

这是你如何设置你的urls.py同时服务于index.html,然后在您的其他静态文件/ Django的1.10(同时仍然能够起到其他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,我在这里写了一个更完整的配置说明 - 尤其是如果您想将其用于生产。