如何配置Django的“staticfiles”应用程序以列出目录内容?

8
我正在使用Django内置的Web服务器,在DEBUG模式下。
这是我的settings.py的一部分:
STATIC_ROOT = '/home/user/static_root'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    '/abs/path/to/static/dir',
)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

如果我访问 http://localhost:8000/static/png/,我期望看到的是在 /abs/path/to/static/dir/png 中可用的文件列表。但我得到了一个 404 错误,错误信息为 “Directory indexes are not allowed here.”。
现在,如果我直接访问文件,例如 http://localhost:8000/static/png/test.png,它可以正常工作。
我已经查阅了一些答案(在这里),但没有成功。
那么,有人知道如何配置 Django 使得 staticfiles 应用程序可以列出目录内容吗?
4个回答

12

为了完整性,也许能帮助其他人,这是我解决问题所做的事情。

按照 @Hedde 的回答,我去使用 show_indexes

settings.py

  • 保留所有配置(即所有 STATIC* 变量)
  • INSTALLED_APPS 中移除 'django.contrib.staticfiles'

问题在于我无法使用 Django 的“内置”静态文件配置方法(通过 settings.py)指定 show_indexes 参数。因为有 'django.contrib.staticfiles'INSTALLED_APPS 中,Django 会创建具有 show_indexes = False 的静态文件处理程序,忽略我的 urlpatterns

urls.py

将以下内容添加到 urlpatterns:

url(regex  = r'^%s(?P<path>.*)$' % settings.STATIC_URL[1:], 
    view   = 'django.views.static.serve', 
    kwargs = {'document_root': '/abs/path/to/static/dir',
              'show_indexes' : True})

1
对于调试模式,它看起来像是 static('foo', document_root='/bar', show_indexes=True) - dibery

8
'show_indexes': True

根据文档说明,

@ArnarYngvason 是的,但它仍然有效。https://github.com/django/django/blob/1.5/django/views/static.py#L23 - Hedde van der Heide
我应该明确在 urls.pyurlpatterns 中添加一个条目吗?我会尝试这样做,但考虑到所有的 STATIC* 配置都在 settings.py 中完成,这似乎有点冗余。 - E.Z.
1
事实上,Django并不提供此服务,因为在正常使用中,Apache或Nginx会处理它...在开发中启用一个功能比在生产环境中禁用它更加清晰。 - christophe31
1
2.2链接 https://docs.djangoproject.com/en/2.2/ref/views/#django.views.static.serve - Ivan Starostin

1
那些文件不是django提供服务的对象。Show indexes是apache/nginx的配置参数。
在生产环境中,使用nginx时,只需在静态服务部分添加:
    location ^~ /static/ {
            autoindex on;
            root /var/www/static_dir;
            if ($query_string) {
                    expires max;
            }
    }

对于开发环境,Hedde的答案确实是正确的答案,但显示可能与您的HTTP服务器提供的不完全相同。不要依赖其外观和感觉。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接