如何在部署Django应用程序时向AWS提供静态文件(`python manage.py collectstatic`不起作用)?
昨天,我创建了这个帖子: 基本上,当我执行如何在部署Django应用程序时向AWS提供静态文件(`python manage.py collectstatic`不起作用)?,django,amazon-web-services,django-rest-framework,Django,Amazon Web Services,Django Rest Framework,昨天,我创建了这个帖子: 基本上,当我执行python manage.py runserver时,它显示了: 但在我将其部署到AWS(eb deploy)之后,我访问该站点时看到的是: 上述帖子的答案提到这是因为我的静态文件丢失了。因此,我搜索了如何在AWS上部署静态文件,发现了本教程: 在“创建站点管理员”部分,它提到为了提供静态文件,我必须首先在settings.py中定义static\u ROOT(我这样做了:static\u ROOT=os.path.join(BASE\u DIR,“e
python manage.py runserver
时,它显示了:
但在我将其部署到AWS(eb deploy
)之后,我访问该站点时看到的是:
上述帖子的答案提到这是因为我的静态文件丢失了。因此,我搜索了如何在AWS上部署静态文件,发现了本教程:
在“创建站点管理员”部分,它提到为了提供静态文件,我必须首先在settings.py
中定义static\u ROOT
(我这样做了:static\u ROOT=os.path.join(BASE\u DIR,“ebdjangoapp/static/”
),然后我进行了eb deploy
)。但是,该站点看起来仍然与第二个图像相同(没有静态文件)。然后,我尝试执行python manage.py collectstatic
(这创建了静态文件夹,其中包含rest\u framework
目录,包含css
文件等),然后再次执行eb部署
,但站点看起来仍然与第二张图片相同
为什么静态文件仍然没有显示
注意,我四处搜索,发现了这篇帖子:答案是:
“然后,您需要通过您选择的web服务器提供设置。STATIC_ROOT
位于设置。STATIC_URL
,通常nginx作为Apache-mod_wsgi应用服务器后面的反向代理。”
但我不知道web服务器(nginx、反向代理、Apache-mod_wsgi)是如何工作的。我有一个Django应用程序,我在本地用python manage.py runserver运行,还有AWS elastic beanstalk。我通过执行
eb deploy
将Django应用程序部署到AWS。我需要采取哪些步骤才能在部署时显示静态文件(假设我不知道如何配置nginx、反向代理等)?有关于从RealPython将django应用程序部署到AWS Elastic Beanstalk的明确指南-。
它有一整节关于静态文件以及如何用eb配置它的内容,您不需要了解nginx/apache等
基本上,您应该在eb配置中定义container\u命令,这些命令将在应用程序部署完成后执行。例如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
part。
您还应该在django设置文件中定义此部分:
STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static")
STATIC_URL = '/static/'
我几乎完全是从上面的文章中复制了这个例子,你们真的应该检查一下,它太棒了
UPD:如何调试丢失的静态文件。
我通常会这样做(这涉及到对您的eb实例进行sshing):
安装的应用程序中包含django.contrib.staticfiles
/static/js/somefile.js
STATIC\u URL
相同,例如/STATIC/
STATIC\u ROOT
中的实际值,并检查此文件夹是否确实包含生产服务器中的静态文件选项\u设置
部分下)/static
目录中(默认情况下,eb在该目录中查找静态数据)。如果它突然开始工作-这意味着您的设置无法覆盖默认设置,您应该检查在其他地方定义了它
我希望这些步骤能帮助你找到正确的方向。这就是我的工作 从
.config
文件中删除任何staticfiles指令。在“软件配置”下查找“静态文件”部分。左边的一栏是您的/static/
url。右侧是相对于父目录的静态文件夹
确保您的STATIC\u ROOT
设置与右侧的值匹配。不要忘记尾随的/
仍然粘贴我的设置
STATIC_URL = '/static/'
STATICFILES_DIRS = ('assets',)
STATIC_ROOT = os.path.join(BASE_DIR, '..', 'www', 'static')
这就是我的文件夹结构相对于设置文件的外观
project/
├── __init__.py
├── settings
│ ├── base.py
│ ├── __init__.py
│ ├── local.py
│ ├── production.py
wsgi.py
,url.py
位于project
文件夹中<代码>www文件夹比项目
文件夹高一级
希望这至少能节省您的周日时间。您是否随时都在运行
python manage.py collectstatic
?@GrahamDumpleton是的,我在eb deploy
之前就做了。(基本上,我是在本地完成的,所有文件都放在静态文件夹中,然后我部署了它)。谢谢链接。所以我编辑了settings.py
,以便STATIC\u ROOT
和STATIC\u URL
就是您提到的。然后,我在.ebextensions
文件夹中创建了一个名为02_python.config
的文件,并复制粘贴了您在此处发布的内容。我将iotd
更改为ebdjango
(我的项目名称..我的应用程序名称是ebdjangoapp
)。然后,我将python ebjango/manage.py collectstatic--noinput
更改为python manage.py collectstatic--noinput
(因为python路径已经指向ebdjango
)。但它仍然不起作用(服务器看起来仍然像我发布的第二张图片)。知道如何调试这个问题吗?回答更新了可能的调试步骤,希望能有所帮助。更新帮助很大!现在,当我让STATIC\u ROOT=os.path.join(BASE\u DIR,“STATIC”)
在我的option\u设置
配置文件中不提staticfiles
时,它会工作(默认位置,如您所述)!当我在选项设置
中为“aws:elasticbeanstalk:container:python:staticfiles”提供绝对或相对路径时,它也可以工作。但当我改变<