python - Django collectstatic 命令在 AWS Elastic Beanstalk Amazon Linux 2 Python 3 平台中失败

标签 python python-3.x django amazon-web-services amazon-elastic-beanstalk

几天来,我一直在努力使用 Amazon Linux 2 Python 3.7 平台将我的 Django 应用程序部署到 Elastic Beanstalk。
管理部署应用程序后,我无法运行命令 python3 manage.py collectstatic --noinput为了让 nginx 能够提供静态文件,从而拥有 Django 管理页面所需的所有 CSS 样式。
现在我在 .ebextensions 目录中有一个名为“static.config”的文件,其中包含以下 YAML 代码:

container_commands:
  collectstatic:
    command: |
      source $PYTHONPATH/activate
      python3 manage.py collectstatic --noinput
我添加了行 source $PYTHONPATH/activate在第一次尝试失败后 this answer .
我还有一个名为“01_python.config”的文件,其中包含以下代码:
option_settings: 
  "aws:elasticbeanstalk:application:environment": 
    DJANGO_SETTINGS_MODULE: "backend_project.settings" 
    "PYTHONPATH": "/var/app/current:$PYTHONPATH"
  "aws:elasticbeanstalk:container:python": 
    WSGIPath: backend_project.wsgi:application
    NumProcesses: 3
    NumThreads: 20
  "aws:elasticbeanstalk:environment:proxy:staticfiles":
    "/static/": "static/"
这是我在 cfn-init.log 中看到的堆栈跟踪:
2020-11-04 14:06:29,217 [ERROR] Command collectstatic (source $PYTHONPATH/activate
python3 manage.py collectstatic --noinput  ) failed
2020-11-04 14:06:29,218 [ERROR] Error encountered during build of postbuild_1_eduvaluer_api: Command collectstatic failed
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 542, in run_config
    CloudFormationCarpenter(config, self._auth_config).build(worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 260, in build
    changes['commands'] = CommandTool().apply(self._config.commands)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/command_tool.py", line 117, in apply
    raise ToolError(u"Command %s failed" % name)
ToolError: Command collectstatic failed
2020-11-04 14:06:29,218 [ERROR] -----------------------BUILD FAILED!------------------------
2020-11-04 14:06:29,218 [ERROR] Unhandled exception during build: Command collectstatic failed
Traceback (most recent call last):
  File "/opt/aws/bin/cfn-init", line 171, in <module>
    worklog.build(metadata, configSets)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 129, in build
    Contractor(metadata).build(configSets, self)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 530, in build
    self.run_config(config, worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 542, in run_config
    CloudFormationCarpenter(config, self._auth_config).build(worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 260, in build
    changes['commands'] = CommandTool().apply(self._config.commands)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/command_tool.py", line 117, in apply
    raise ToolError(u"Command %s failed" % name)
ToolError: Command collectstatic failed
阅读此跟踪时,我想到的一个问题是:为什么要使用 python 2 来执行任何脚本?
如果有人设法解决了这个问题,我将非常感谢任何帮助。我能找到的所有文档和答案都已经过时了(对于 Amazon Linux Python 3.6 平台)。
我的 Django 应用程序需要的唯一静态文件是 Django 管理页面的样式,因为该应用程序是 Angular 应用程序的后端。
先感谢您!
编辑:
  • "PYTHONPATH":"/var/app/current:$PYTHONPATH"。我假设 $PYTHONPATH 应该是一个环境变量但是当我执行命令时 env要查看服务器的环境变量,PYTHONPATH 不是其中之一。
  • 按照评论中的要求,我尝试通过 ssh 进入 de EB 实例并运行 python3 manage.py collectstatic --noinput命令。这是我得到的:

  • (暂存) [ec2-user@ip-172-31-94-128 current]$ python3 manage.py collectstatic --noinput
    /var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/environ/environ.py:639: UserWarning: E​​rror reading/var/app/current/.env - 如果你没有配置你的环境分开,检查这个。
    “环境分开,检查这个。” % env_file)
    回溯(最近一次调用最后一次):
    文件“/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/environ/environ.py”,第 273 行,在 get_value 中
    值 = self.ENVIRON[var]
    文件“/usr/lib64/python3.7/os.py”,第 681 行,在 中getitem
    从 None 提高 KeyError(key)
    key 错误:'SECRET_KEY'
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "manage.py", line 23, in <module>
        main()
      File "manage.py", line 19, in main
        execute_from_command_line(sys.argv)
      File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
        utility.execute()
      File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/core/management/__init__.py", line 395, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/core/management/__init__.py", line 231, in fetch_command
        settings.INSTALLED_APPS
      File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/conf/__init__.py", line 76, in __getattr__
        self._setup(name)
      File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/conf/__init__.py", line 63, in _setup
        self._wrapped = Settings(settings_module)
      File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/conf/__init__.py", line 142, in __init__
        mod = importlib.import_module(self.SETTINGS_MODULE)
      File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
      File "<frozen importlib._bootstrap>", line 983, in _find_and_load
      File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 728, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "/var/app/current/backend_project/settings.py", line 45, in <module>
        SECRET_KEY =env("SECRET_KEY")
      File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/environ/environ.py", line 123, in __call__
        return self.get_value(var, cast=cast, default=default, parse_default=parse_default)
      File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/environ/environ.py", line 277, in get_value
        raise ImproperlyConfigured(error_msg)
    django.core.exceptions.ImproperlyConfigured: Set the SECRET_KEY environment variable
    
    我在运行命令之前激活了虚拟环境,我知道环境变量(包括 SECRET_KEY)已加载,因为当我运行命令时 /opt/elasticbeanstalk/bin/get-config environment所有这些都打印在控制台上。这越来越令人困惑。
    另一件有用的事情是所有静态文件似乎都在/static 目录中。
    在我的 settings.py 文件中,我有以下内容:
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    
    据我了解,这应该表明 Django 在静态目录中查找静态文件。也许我理解错了,问题就在这里。

    最佳答案

    嘿,我刚刚使用静态文件成功部署了我的 django 应用程序。这是我的配置的样子。
    django.config

    container_commands:
      01_collectstatic:
        command: "source $PYTHONPATH/activate && python manage.py collectstatic --noinput"
    option_settings:
      aws:elasticbeanstalk:container:python:
        WSGIPath: appname.wsgi:application
      aws:elasticbeanstalk:environment:proxy:staticfiles:
        /static: static
    
    设置.py
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.1/howto/static-files/
    STATIC_URL = '/static/'
    STATIC_ROOT = 'static'
    
    环境变量适用于 ebs 环境,而不是我认为的 EC2 实例本身。当我通过 ssh 进入 EC2 实例时,我也没有看到 PYTHONPATH,但我确实在 AWS 控制台上的 Environment > Configuration > Software 的 ebs 环境的环境变量中看到了它
    /var/app/venv/staging-LQM1lest/bin
    
    这是我的文件结构:
    ┣ .ebextensions/
    ┃ ┗ django.config
    ┣ .elasticbeanstalk/
    ┃ ┗ config.yml
    ┣ appname/
    

    关于python - Django collectstatic 命令在 AWS Elastic Beanstalk Amazon Linux 2 Python 3 平台中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64681889/

    相关文章:

    python - “PlayerStatsForm”对象没有属性 'username'

    服务器运行时 Python 程序暂停

    python - 如何通过电报机器人发送 PIL 图像而不将其保存到文件中

    python - 在字典中查找最小非零值 (Python)

    Django:ModelForm 中的自定义操作

    python - 如何通过{{variable/method}}将Django模板代码注入(inject)到模板中?

    python - 你能创建一个函数来在 Python 中为你创建一个类的多个实例吗?

    python - Pandas - 带有用于堆叠的列值的堆叠条形图

    python - Tkinter 文本小部件 - 在事件函数中使用单击的文本

    python-3.x - (Python 3) Spider 必须返回 Request、BaseItem、dict 或 None,得到 'generator'