Django:当 DEBUG=False 时,为什么我的静态文件没有显示并且总是给我一个 404 错误?
Django: Why are my static files not showing up and always giving me a 404 error when DEBUG=False?
我正在 Windows 机器上工作,试图为名为 "portal" 的项目开发多个应用程序。在处理它之后,我设置了 DEBUG=False,现在我所有的静态文件在加载任何页面后都给我一个 404 错误。当在 CMD 中 运行 python manage.py runserver
时,我在加载页面时得到这个:
[02/Dec/2018 14:10:14] "GET /account/sign-in HTTP/1.1" 200 6249
[02/Dec/2018 14:10:14] "GET /static/fonts/fonts.css HTTP/1.1" 404 96
[02/Dec/2018 14:10:14] "GET /static/css/argon.css HTTP/1.1" 404 94
[02/Dec/2018 14:10:14] "GET /static/branding/logo.png HTTP/1.1" 404 98
我查看了 20 多篇关于此的帖子,这些帖子大多相同,并且我遵循了他们的所有步骤,例如:
- 我在我的 settings.py 文件中设置了这些:
STATIC_URL = '/static/'
、STATICFILES_DIRS = ['portal/static/']
(我在文件夹中有一个静态文件夹,用于保存 settings.py 等文件),以及STATIC_ROOT = os.path.join(BASE_DIR, "static")
- 我打过
python manage.py collectstatic
我什至创建了一个新的 Django 测试项目并执行了上述所有这些步骤,它们正在为那个新的测试项目工作。我什至删除了 __pycache__
中的所有文件并重置了我的迁移和数据库文件。
是否有任何其他可能的安全(我看到其他人使用诸如 --insecure 之类的作弊)解决方案来修复我的项目,以便它可以投入生产,而不是上面的其他解决方案?
所以我更多地研究了 Jon Clements 和其他人所说的关于 Django 如何在 DEBUG=False
时不再处理静态文件的内容,并且您需要一个 HTTP Web 服务器来为这些文件提供服务。这实际上是 true。我以前从没想过,因为我的其他项目仍然提供静态文件,但这可能是因为我的浏览器缓存了这些文件。
这是另一个 post 证明了这一点:
Why does DEBUG=False setting make my django Static Files Access fail?
这是一个根据代码托管位置提供静态文件的解决方案:
- 没有 HTTP Web 服务器,您可以使用 WhiteNoise 提供静态文件(但我不建议将其用于生产环境)
- 使用 Apache 或任何其他 HTTP Web 服务器,您可以通过修改配置文件来提供静态文件(在此处了解更多信息:How to use Django with Apache and mod_wsgi)
- 如果您像我一样使用 Azure,我建议您使用 Blob 存储来处理所有静态和媒体文件(中 post:Django — Using Azure blob storage to handle static & media assets — from scratch)
在此处了解有关 Django 静态文件部署(官方文档)的更多信息:Deploying static files
补充一下@Alvin Tang,
为了在 DEBUG = False
时在生产中测试您的项目,您可以 运行 服务器使用: python manage.py runserver --insecure
。这假定错误的调试设置,模仿生产环境,并且 deploys 您的项目按预期方式为您的静态文件提供服务(或者至少这是我认为的),前提是您的静态设置是正确的- 在大多数情况下都是如此。
经过测试并在 Django 上工作 == 3.0.6
我正在 Windows 机器上工作,试图为名为 "portal" 的项目开发多个应用程序。在处理它之后,我设置了 DEBUG=False,现在我所有的静态文件在加载任何页面后都给我一个 404 错误。当在 CMD 中 运行 python manage.py runserver
时,我在加载页面时得到这个:
[02/Dec/2018 14:10:14] "GET /account/sign-in HTTP/1.1" 200 6249
[02/Dec/2018 14:10:14] "GET /static/fonts/fonts.css HTTP/1.1" 404 96
[02/Dec/2018 14:10:14] "GET /static/css/argon.css HTTP/1.1" 404 94
[02/Dec/2018 14:10:14] "GET /static/branding/logo.png HTTP/1.1" 404 98
我查看了 20 多篇关于此的帖子,这些帖子大多相同,并且我遵循了他们的所有步骤,例如:
- 我在我的 settings.py 文件中设置了这些:
STATIC_URL = '/static/'
、STATICFILES_DIRS = ['portal/static/']
(我在文件夹中有一个静态文件夹,用于保存 settings.py 等文件),以及STATIC_ROOT = os.path.join(BASE_DIR, "static")
- 我打过
python manage.py collectstatic
我什至创建了一个新的 Django 测试项目并执行了上述所有这些步骤,它们正在为那个新的测试项目工作。我什至删除了 __pycache__
中的所有文件并重置了我的迁移和数据库文件。
是否有任何其他可能的安全(我看到其他人使用诸如 --insecure 之类的作弊)解决方案来修复我的项目,以便它可以投入生产,而不是上面的其他解决方案?
所以我更多地研究了 Jon Clements 和其他人所说的关于 Django 如何在 DEBUG=False
时不再处理静态文件的内容,并且您需要一个 HTTP Web 服务器来为这些文件提供服务。这实际上是 true。我以前从没想过,因为我的其他项目仍然提供静态文件,但这可能是因为我的浏览器缓存了这些文件。
这是另一个 post 证明了这一点:
Why does DEBUG=False setting make my django Static Files Access fail?
这是一个根据代码托管位置提供静态文件的解决方案:
- 没有 HTTP Web 服务器,您可以使用 WhiteNoise 提供静态文件(但我不建议将其用于生产环境)
- 使用 Apache 或任何其他 HTTP Web 服务器,您可以通过修改配置文件来提供静态文件(在此处了解更多信息:How to use Django with Apache and mod_wsgi)
- 如果您像我一样使用 Azure,我建议您使用 Blob 存储来处理所有静态和媒体文件(中 post:Django — Using Azure blob storage to handle static & media assets — from scratch)
在此处了解有关 Django 静态文件部署(官方文档)的更多信息:Deploying static files
补充一下@Alvin Tang,
为了在 DEBUG = False
时在生产中测试您的项目,您可以 运行 服务器使用: python manage.py runserver --insecure
。这假定错误的调试设置,模仿生产环境,并且 deploys 您的项目按预期方式为您的静态文件提供服务(或者至少这是我认为的),前提是您的静态设置是正确的- 在大多数情况下都是如此。
经过测试并在 Django 上工作 == 3.0.6