白噪声和/或静态文件导致服务器错误(500)

3

当DEBUG = True时,我可以通过Django将我的应用程序部署到Heroku,但当DEBUG = False时,我会收到一个服务器错误。我认为这与我如何设置静态文件有关。当我注释掉“STATICFILES_STORAGE ='whitenoise.django.GzipManifestStaticFilesStorage'”时,我不会收到错误消息,但网站完全没有格式。以下是相关的settings.py代码:

INSTALLED_APPS = [
...    
    'django.contrib.staticfiles',
...
]

ALLOWED_HOSTS = ['*']

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

STATIC_ROOT= os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'


STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'),
)

我已经将静态文件夹添加到各种位置(与settings.py在同一文件夹中,根文件夹中等),但仍无法解决问题。

有任何想法吗?


运行 python manage.py collectstatic 并重试,同时还要包括错误信息,不是500错误,请将DEBUG设置为False并尝试运行 python manage.py runserver,并检查堆栈跟踪。 - Renjith Thankachan
通常情况下,你应该避免在生产环境中使用Django runserver和staticfiles。它们仅用于开发目的。 - 2ps
不相关但重要的提示:出于安全考虑,请在ALLOWED_HOSTS设置中指定您实际使用的域名。不要使用ALLOWED_HOSTS = ['*'],尽管这是可能的,但这有点反模式。请参阅https://docs.djangoproject.com/en/1.10/ref/settings/#allowed-hosts获取相关文档。 - Peterino
3个回答

1
您可能忘记在settings.py的MIDDLEWARE设置中包含whitenoice中间件。请编辑您的settings.py文件并将WhiteNoise添加到MIDDLEWARE_CLASSES列表中,除了Django的SecurityMiddleware之外的所有其他中间件之上。
MIDDLEWARE_CLASSES = [
# 'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
#...
]

更多信息可以在whitenoise文档中找到:http://whitenoise.evans.io/en/stable/django.html

按照逐步设置来查看您缺少什么。 Heroku文档往往会省略中间件添加-这会导致错误-也许还有其他一些应用程序缺失的内容。


0

这些静态文件的设置直接来自Heroku网站(https://devcenter.heroku.com/articles/django-assets)。当我运行python manage.py collectstatic时,我遇到了一个关键错误'DATABASE_URL',我不得不export一个值,然后当我将我的文件推送到Heroku时,网站正常工作。


0

我一直面临着完全相同的问题,但不是静态文件,而是DEBUG = False导致了这个问题。当我意识到这一点时,我记得昨天访问了一个 GitHub 存储库,里面有解决我的问题的方法。

https://github.com/8sagh8/DjangoRestApi-part1-youtube-project/blob/main/README.md

您可以在生产环境和开发环境之间不断更改 DEBUGFalseTrue,或者您可以使用以下代码:

import sys

if (len(sys.argv) >= 2 and sys.argv[1] == 'runserver'):
   DEBUG = True
else:
   DEBUG = False


如果您曾经使用过C程序,那么这段代码看起来会非常熟悉。上面的代码检查您是否在python manage.py runserver的末尾键入了runserver,并将DEBUG设置为True,否则它将把DEBUG设置为False

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