提供媒体文件,不提供静态文件

时间:2012-06-12 20:21:02

标签: django static-files django-staticfiles

我因an evergreen issue而被卡住,未提供静态文件。相反,放置在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 staticfiles自动提供(不是我的情况),而其他文件必须手动处理。所以我将这些行添加到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.为什么?

3 个答案:

答案 0 :(得分:6)

  

STATIC_URL下的文件应该由Django staticfiles自动提供(不是我的情况),而其他文件必须手动处理。

这是不正确的。 Django永远不会服务STATIC_ROOT - 甚至不在开发中。 所做的是在每个应用程序的“静态”目录中创建文件,并在STATICFILES_DIRS中指定的STATIC_URL中指定的任何目录中的文件。你实际上并没有在STATIC_ROOT中手动放置任何东西;事实上,在开发中,你甚至不应该有那个目录。简而言之,STATIC_ROOT只是运行collectstatic管理命令时静态文件在生产中的转储基地。

在开发过程中,所有静态文件都应该进入someapp/static,其中“someapp”是他们应用的应用程序。如果文件作为一个整体应用于项目,例如全局CSS文件,则需要创建一个完全不同的目录(即STATIC_ROOT或{{相同1}})然后将该目录添加到MEDIA_ROOT。例如,我通常称之为“资产”,所以:

STATICFILES_DIRS

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这个问题真的很常见...... 一些提示:

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

INSTALLED_APPS = (
    # ...
    'django.contrib.staticfiles',
    # ... 
)
  • 你用过吗? django-admin-collectstatic命令?
  • 您可以帮助在网址设置中添加show_indexes=True吗?
  • 一些符号链接?
  • 使用--adminmedia = .. / grappelli / static / grappelli arg运行应用程序。

我对django 1.4(没有grappelli)的设置:

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',
    # ...
)