【发布时间】:2021-02-17 06:07:22
【问题描述】:
几天来,我一直在努力使用 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
我在this answer 之后的第一次尝试失败后添加了source $PYTHONPATH/activate 行。
我还有一个名为“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 不是其中之一。 -
按照 cmets 中的要求,我尝试 ssh 进入 de EB 实例并运行
python3 manage.py collectstatic --noinput命令。这是我得到的:
(staging) [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: Error reading /var/app/current/.env - 如果你没有配置你的单独的环境,检查这个。 “环境分开,检查这个。” % 环境文件) 回溯(最近一次通话最后): 文件“/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/environ/environ.py”,第 273 行,在 get_value 值 = self.ENVIRON[var] getitem 中的文件“/usr/lib64/python3.7/os.py”,第 681 行 从无提高 KeyError(key) KeyError: '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 在静态目录中查找静态文件。也许我理解错了,问题就出在这里。
【问题讨论】:
-
你能打印出
$PYTHONPATH吗? -
我将 ssh 进入服务器并将其添加到问题中。
-
@cizario 让我知道您是否需要其他任何东西。
-
如果还没有完成,看看这个教程:realpython.com/…
-
我看过几乎所有的教程,问题是它们中的大多数,就像你引用的那样,已经过时了。 AWS 今年发布了 AL2 Python 3.7。我能找到的最新教程是这个:justabout.cloud/… 它不包括这个问题的主题。
标签: python python-3.x django amazon-web-services amazon-elastic-beanstalk