如何在部署Django应用程序时将静态文件提供给AWS(`python manage.py collectstatic`不起作用)?

时间:2017-02-25 23:29:15

标签: 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

在“创建网站管理员”部分下,它提到为了提供静态文件,我必须先在STATIC_ROOT中定义settings.py(所以我做了:STATIC_ROOT = os.path.join(BASE_DIR, "ebdjangoapp/static/"))并且然后我做了eb deploy。但是,该站点看起来仍然与第二个图像相同(没有静态文件)。然后我尝试了python manage.py collectstatic(这创建了包含rest_framework文件的静态文件夹,其中包含css文件等等。然后再次eb deploy但网站stil看起来和第二张图像一样。

静态文件怎么还没出现?

注意,我搜索过并发现了这篇文章:Django app deployment not loading static files,答案是:

“然后,您需要通过您选择的网络服务器在settings.STATIC_ROOT提供settings.STATIC_URL,非常常见的是nginx作为Apache-mod_wsgi应用服务器后面的反向代理。”

但我不知道Web服务器(nginx,反向代理,Apache-mod_wsgi)是如何工作的。我有一个Django应用程序,我用python manage.py runserver本地运行,我有AWS弹性beanstalk。我通过eb deploy将我的Django应用程序部署到AWS。我需要采取哪些步骤才能在部署中显示静态文件(假设我不知道如何配置nginx,反向代理等)。?

2 个答案:

答案 0 :(得分:16)

关于从RealPython - here it is向AWS Elastic Beanstalk部署django应用程序的确切指南。 它有关于静态文件以及如何使用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实例sshing):

  1. 确保我的django.contrib.staticfiles
  2. 中包含INSTALLED_APPS
  3. 在浏览器控制台网址中检查丢失的文件,例如 /static/js/somefile.js
  4. 请确保在我的django设置中STATIC_URL相同,例如/static/
  5. 检查STATIC_ROOT中的实际值,并检查此文件夹是否实际包含生产服务器中的静态文件。
  6. 检查我的eb配置是否指向正确的文件夹(在配置中的option_settings部分下)
  7. 此外,您可以尝试在生产服务器上收集静态到/static目录(默认情况下,eb会查找它们)。如果它突然开始工作 - 这意味着你的设置无法覆盖默认设置,你应该检查它的定位位置。

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

答案 1 :(得分:1)

这对我有用。

.config文件中删除所有staticfiles指令。在软件配置下找到静态文件部分。左列是您的/static/个网址。右边是相对于您的父目录的静态文件夹。

enter image description here

确保您的STATIC_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.pyurls.py位于project文件夹中。 www文件夹位于project文件夹上方一级。

希望这至少可以节省你的星期天。