昨天,我创建了这篇文章:DjangoRestFramework browsable api looks different locally vs when deployed on server?
基本上,当我执行python manage.py runserver
时,出现了:
但是在我将其部署到 AWS (eb deploy
) 后,我在访问该站点时看到的是:
上面帖子的答案提到这是因为我的静态文件丢失了。所以我搜索了如何在AWS上部署静态文件并发现了这个教程:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html#python-django-update-app
在“创建站点管理员”部分下,它提到为了提供静态文件,我必须首先在 settings.py
中定义 STATIC_ROOT
(所以我做了:STATIC_ROOT = os.path.join(BASE_DIR, "ebdjangoapp/static/")
),然后我进行了eb部署
。但是,该网站看起来仍然与第二张图片相同(没有静态文件)。然后我尝试执行 python manage.pycollectstatic
(这创建了静态文件夹,其中包含 rest_framework
目录,其中包含 css
文件等)然后再次进行eb部署
,但网站看起来仍然与第二张图片相同。
为什么静态文件仍然不显示?
注意,我四处搜索并发现了这篇文章:Django app deployment not loading static files答案是:
“然后,您需要通过您选择的 Web 服务器在 settings.STATIC_URL
处提供 settings.STATIC_ROOT
,通常将 nginx 作为 Apache-mod_wsgi 应用程序背后的反向代理服务器。”
但我不知道 Web 服务器(nginx、反向代理、Apache-mod_wsgi)如何工作。我有一个使用 python manage.py runserver
在本地运行的 Django 应用程序,并且我有 AWS elastic beanstalk。我通过执行 eb deploy 将 Django 应用程序部署到 AWS。我需要采取哪些步骤才能使静态文件出现在部署中(假设我不知道如何配置 nginx、反向代理等)。?
最佳答案
有关于从 RealPython 将 django 应用程序部署到 AWS Elastic Beanstalk 的明确指南 - here it is 。 它有关于静态文件以及如何使用 eb 配置它的完整部分,您不需要了解有关 nginx/apache 等的任何信息。
基本上,您应该在 eb 配置中定义 container_commands
,这些命令将在应用程序部署完成后执行。例如 migrate
和 collectstatic
,这是 eb 配置文件中此类部分的示例:
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput"
leader_only: true
02_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"
option_settings:
"aws:elasticbeanstalk:application:environment":
DJANGO_SETTINGS_MODULE: "iotd.settings"
"PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
"ALLOWED_HOSTS": ".elasticbeanstalk.com"
"aws:elasticbeanstalk:container:python":
WSGIPath: iotd/iotd/wsgi.py
NumProcesses: 3
NumThreads: 20
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "www/static/"
注意aws:elasticbeanstalk:container:python:staticfiles
部分。
而且您还应该在 django 设置文件中定义这部分:
STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static")
STATIC_URL = '/static/'
我几乎完全从上面的文章中复制了这个示例,你真的应该检查一下,它太棒了。
UPD:如何调试丢失的静态文件。 我通常这样做(它涉及到您的 eb 实例):
- 确保
django.contrib.staticfiles
包含在我的INSTALLED_APPS
中。 - 在浏览器控制台中检查缺失文件的 URL,例如
/static/js/somefile.js
- 确保我的 django 设置中的
STATIC_URL
相同,例如/static/
。 - 检查
STATIC_ROOT
中的实际值,并检查该文件夹是否确实包含生产服务器中的静态文件。 - 检查我的 eb 配置是否指向正确的文件夹(在配置中的
option_settings
部分下)
您还可以尝试将静态收集到生产服务器上的 /static
目录中(这是 eb 默认查找它们的位置)。如果它突然开始工作 - 这意味着您的设置无法覆盖默认设置,您应该检查它是在其他位置定义的。
我希望这些步骤能够帮助您找到正确的方向。
关于django - 当部署 Django 应用程序 (`python manage.py collectstatic` 不起作用时,如何向 AWS 提供静态文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462880/