Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在部署Django应用程序时向AWS提供静态文件(`python manage.py collectstatic`不起作用)?_Django_Amazon Web Services_Django Rest Framework - Fatal编程技术网

如何在部署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
  • 签入缺少文件的浏览器控制台url,例如。
    /static/js/somefile.js
  • 确保my django设置中的
    STATIC\u URL
    相同,例如
    /STATIC/
  • 检查
    STATIC\u ROOT
    中的实际值,并检查此文件夹是否确实包含生产服务器中的静态文件
  • 检查我的eb配置是否指向正确的文件夹(在配置中的
    选项\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”提供绝对或相对路径时,它也可以工作。但当我改变<