Django 不提供静态文件
Django isn't serving static files
我正在使用一个现有的(和以前可用的)Django 站点。我们最近从 Django 1.8.13 升级到 1.10,我们的 WSGI 是 Gunicorn。从我的开发机器托管时它工作正常,但在部署时,所有静态资源(在管理和主站点上)产生 404 消息,Directory indexes are not allowed here.
我们的 settings.py
包含以下内容:
INSTALLED_APPS = (
...
'django.contrib.staticfiles',
...
)
DEBUG = True
STATIC_URL = '/static/'
PROJECT_DIR = os.path.dirname(os.path.dirname(__file__))
STATICFILES_DIRS = (
os.path.join(PROJECT_DIR, 'static'),
)
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static_resources')
目录结构如下所示:
/my-project-name
/my-project-name
server.py
settings.py
urls.py
wsgi.py
...
/static
/static_resources
manage.py
尝试将 os.path.join(PROJECT_DIR, '../static') 更改为 os.path.join(PROJECT_DIR, 'static') 和 STATIC_ROOT = os.path.join(PROJECT_DIR, '../static_resources') 到 STATIC_ROOT = os.path.join(PROJECT_DIR, 'static_resources' ).它会解决你的问题。
Django 在生产模式下不提供静态文件 (DEBUG=False)。在生产部署中,这是网络服务器的工作。解决问题:
- 运行
python manage.py collectstatic
- 在您的 Web 服务器配置中,将
/static
文件夹指向 Django 的静态文件夹
不要只打开DEBUG,那样很危险!
答案很微妙。当我将 Django 升级到 1.9 和 运行 服务器时,它给出了以下警告:
?: (urls.W001) Your URL pattern '^static/(?P<path>.*)$' uses include with a regex ending with a '$'. Remove the dollar from the regex to avoid problems including URLs.
在 urls.py
中,我的 urlpatterns
列表包含:
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT,
}),
我改成了:
url(r'^static/(?P<path>.*)/', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT,
}),
这消除了警告,但导致静态资源停止加载。
它必须是:
url(r'^static/(?P<path>.*)', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT,
}),
为什么这在我的开发机器(Macbook)和团队的开发机器(windows 笔记本电脑)上工作,但在我们的 Linux 服务器。但是,它现在可以工作了,所以我已经完成了尝试。
我正在使用一个现有的(和以前可用的)Django 站点。我们最近从 Django 1.8.13 升级到 1.10,我们的 WSGI 是 Gunicorn。从我的开发机器托管时它工作正常,但在部署时,所有静态资源(在管理和主站点上)产生 404 消息,Directory indexes are not allowed here.
我们的 settings.py
包含以下内容:
INSTALLED_APPS = (
...
'django.contrib.staticfiles',
...
)
DEBUG = True
STATIC_URL = '/static/'
PROJECT_DIR = os.path.dirname(os.path.dirname(__file__))
STATICFILES_DIRS = (
os.path.join(PROJECT_DIR, 'static'),
)
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static_resources')
目录结构如下所示:
/my-project-name
/my-project-name
server.py
settings.py
urls.py
wsgi.py
...
/static
/static_resources
manage.py
尝试将 os.path.join(PROJECT_DIR, '../static') 更改为 os.path.join(PROJECT_DIR, 'static') 和 STATIC_ROOT = os.path.join(PROJECT_DIR, '../static_resources') 到 STATIC_ROOT = os.path.join(PROJECT_DIR, 'static_resources' ).它会解决你的问题。
Django 在生产模式下不提供静态文件 (DEBUG=False)。在生产部署中,这是网络服务器的工作。解决问题:
- 运行
python manage.py collectstatic
- 在您的 Web 服务器配置中,将
/static
文件夹指向 Django 的静态文件夹
不要只打开DEBUG,那样很危险!
答案很微妙。当我将 Django 升级到 1.9 和 运行 服务器时,它给出了以下警告:
?: (urls.W001) Your URL pattern '^static/(?P<path>.*)$' uses include with a regex ending with a '$'. Remove the dollar from the regex to avoid problems including URLs.
在 urls.py
中,我的 urlpatterns
列表包含:
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT,
}),
我改成了:
url(r'^static/(?P<path>.*)/', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT,
}),
这消除了警告,但导致静态资源停止加载。 它必须是:
url(r'^static/(?P<path>.*)', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT,
}),
为什么这在我的开发机器(Macbook)和团队的开发机器(windows 笔记本电脑)上工作,但在我们的 Linux 服务器。但是,它现在可以工作了,所以我已经完成了尝试。