django - 当部署 Django 应用程序 (`python manage.py collectstatic` 不起作用时,如何向 AWS 提供静态文件)?

标签 django amazon-web-services django-rest-framework

昨天,我创建了这篇文章:DjangoRestFramework browsable api looks different locally vs when deployed on server?

基本上,当我执行python manage.py runserver时,出现了:local

但是在我将其部署到 AWS (eb deploy) 后,我在访问该站点时看到的是:on 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,这些命令将在应用程序部署完成后执行。例如 migratecollectstatic,这是 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 实例):

  1. 确保 django.contrib.staticfiles 包含在我的 INSTALLED_APPS 中。
  2. 在浏览器控制台中检查缺失文件的 URL,例如 /static/js/somefile.js
  3. 确保我的 django 设置中的 STATIC_URL 相同,例如/static/
  4. 检查 STATIC_ROOT 中的实际值,并检查该文件夹是否确实包含生产服务器中的静态文件。
  5. 检查我的 eb 配置是否指向正确的文件夹(在配置中的 option_settings 部分下)

您还可以尝试将静态收集到生产服务器上的 /static 目录中(这是 eb 默认查找它们的位置)。如果它突然开始工作 - 这意味着您的设置无法覆盖默认设置,您应该检查它是在其他位置定义的。

我希望这些步骤能够帮助您找到正确的方向。

关于django - 当部署 Django 应用程序 (`python manage.py collectstatic` 不起作用时,如何向 AWS 提供静态文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462880/

相关文章:

django:当 debug = False 时显示数据库错误

python - Django REST框架: Purpose of CreateOnlyDefault

java - 将 Grails 部署到 AWS 错误 404

amazon-web-services - 如何在AWS Athena中使用LISTAGG?

amazon-web-services - 为什么 RDS 不使用 Amazon 根证书进行 SSL 连接

django - 动态更改序列化程序字段

python - NameError at/name 'article_finish_date' 未定义

mysql - 非常大的字段对 MySQL 数据库有负面影响吗?

python - Django - i18n.set_language() 可以存储在用户配置文件中吗

django - DRF : callable in serializer choicefield "choices"