2012-06-12 44 views
1

我被卡住了,因为anevergreenissue,静态文件没有提供。相反,放在MEDIA_ROOT子树中的文件在MEDIA_URL下得到正确的服务。提供媒体文件,静态文件不是

剥离settings.py

DEBUG = True 
STATIC_URL = '/static/' 
STATIC_ROOT = '/home/foo/devel/static' 
MEDIA_URL = '/media/' 
MEDIA_ROOT = '/home/foo/devel/media' 
# the following is deprecated but is it seems grappelly requires it 
ADMIN_MEDIA_PREFIX = STATIC_URL + "grappelli/" 
STATIC_FILES =() 
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
) 

创建项目我做:

$ cd /home/foo/devel/ 
$ virtualenv testdrive 
$ . bin/activate; pip install django; cd testdrive 
$ django-admin.py fbtest 

,并得到这个目录树(剥离):

. <-- /home/foo/devel/ 
├── bin 
├── fbtest 
│   └── fbtest 
│    ├── media 
│    │   └── foo.jpg 
│    ├── static 
│  └────── foo.jpg 
├── include 
└── lib 

文件下STATIC_URL,应服由Django静态文件自动(不在我的情况下),而其他文件有要手动处理。所以我追加这些行urls.py

import settings 
if settings.DEBUG: 
    urlpatterns += patterns('', 
     url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip("/"), 
      'django.views.static.serve', { 
      'document_root': settings.MEDIA_ROOT, 
     }), 
    ) 

访问http://host/media/filebrowser/foo.jpg作品,而http://host/static/foo.jpg给出错误404,为什么?

+0

你用什么样的django? – Dingo

+0

对,Django 1.4。 – Paolo

+0

您可以在'INSTALLED_APPS'中添加已剥离的settings.py文件吗? –

回答

1

这是一个愚蠢的错误。我忘了将fbtest添加到INSTALLED_APPS,因此静态文件机器未管理此应用程序的静态文件。

0

这个问题是真的常绿... 一些提示:

TEMPLATE_CONTEXT_PROCESSORS = (
    # ... 
    'django.core.context_processors.static', 
    # ... 
) 

INSTALLED_APPS = (
    # ... 
    'django.contrib.staticfiles', 
    # ... 
) 

我的Django的1.4(无格拉佩利)设置:

urls.py

if settings.DEBUG: 
    urlpatterns = patterns('', 

     url(r'^%s(?P<path>.*)$' % settings.STATIC_URL.lstrip('/'), 'django.views.static.serve', 
      {'document_root': settings.STATIC_ROOT, "show_indexes": True}), 

     url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 'django.views.static.serve', 
      {'document_root': settings.MEDIA_ROOT, "show_indexes": True}), 

    ) + urlpatterns 

settings.py

MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media') 
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static') 
MEDIA_URL = '/media/' 
STATIC_URL = '/static/' 
ADMIN_MEDIA_PREFIX = '/static/admin/' 


TEMPLATE_CONTEXT_PROCESSORS = (
    # ... 
    'django.core.context_processors.static', 
    # ... 
) 

INSTALLED_APPS = (
    # ... 
    # 'django.contrib.staticfiles', 
    # ... 
) 
+0

谢谢。 _1._我试过但没有帮助。 _2._既不要将“show_indexes:True”添加到字典中。 _3._ YES,virtualenv创建一个包含这些链接的'local'目录:'bin->/home/foo/devel/testdrive/bin','include->/home/foo/devel/testdrive/include'和'lib - >/home/foo/devel/testdrive/lib'。 _4._对不起,我不知道如何使用--adminmedia选项。 – Paolo

+0

python manage.py runserver --adminmedia = ../path-to-grappelli/grappelli/static/grappelli – Dingo

+0

manage.py:error:no such option:--adminmedia – Paolo

6

Files under STATIC_URL should be served automatically by Django staticfiles (not in my case), while other files have to be handled manually.

这是不正确。 Django从来没有服务过STATIC_ROOT - 甚至在开发中。 做什么做的是在每个应用程序的“静态”目录中创建文件,并在STATICFILES_DIRS中指定的任何目录中的文件可在STATIC_URL处获得。您实际上并没有手动将任何东西放入STATIC_ROOT;事实上,在开发中,你甚至不应该有那里的目录。简单地说,当您运行collectstatic管理命令时,STATIC_ROOT只是您的静态文件生产的倾倒地。

在开发中,所有静态文件都应该放入someapp/static,其中“someapp”是它们应用的应用程序。例如,如果文件适用于整个项目(例如全局CSS文件),则需要创建一个完全不同的目录(即而不是STATIC_ROOTMEDIA_ROOT相同),然后将该目录添加到STATICFILES_DIRS。例如,我通常称为我的“资产”,因此:

+0

+1感谢您的好解释,现在事情更加清晰。 – Paolo

+0

@Chris Pratt:你如何参考'someapp/static'中的应用程序?对我而言,'STATIC_URL'只能访问'STATIC_ROOT'(Django 1.3)中的文件。 –

+0

@ Mr.Dave:这是在开发还是在生产。在开发中,完全删除'STATIC_ROOT'目录。我注意到Django倾向于在开发中提供文件*,如果它存在,而不是实际引用所有应用程序的静态目录和'STATICFILES_DIRS'中的任何内容。在制作过程中,只需运行'collectstatic'即可将所有内容复制到那里,然后通过Web服务器提供该目录。 –