昨天,我创建了这篇文章:DjangoRestFramework browsable api looks different locally vs when deployed on server?
基本上,当我执行python manage.py runserver
时,会显示:
但是在我将其部署到AWS(eb 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,反向代理等)。?
答案 0 :(得分:16)
关于从RealPython - here it is向AWS Elastic Beanstalk部署django应用程序的确切指南。 它有关于静态文件以及如何使用eb进行配置的整个部分,您不需要了解有关nginx / apache等的任何信息。
基本上你应该在你的eb配置中定义container_commands
,这些命令将在应用程序部署完成后执行。例如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
部分。
您还应该在django设置文件中定义此部分:
STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static")
STATIC_URL = '/static/'
我几乎完全从上面的文章中复制了这个例子,你应该检查它,它很棒。
UPD:如何调试缺少的静态文件。 我通常这样做(它涉及到你的eb实例sshing):
django.contrib.staticfiles
。INSTALLED_APPS
/static/js/somefile.js
STATIC_URL
相同,例如/static/
。STATIC_ROOT
中的实际值,并检查此文件夹是否实际包含生产服务器中的静态文件。option_settings
部分下)此外,您可以尝试在生产服务器上收集静态到/static
目录(默认情况下,eb会查找它们)。如果它突然开始工作 - 这意味着你的设置无法覆盖默认设置,你应该检查它的定位位置。
我希望这些步骤可以帮助您找到正确的方向。
答案 1 :(得分:1)
这对我有用。
从.config
文件中删除所有staticfiles指令。在软件配置下找到静态文件部分。左列是您的/static/
个网址。右边是相对于您的父目录的静态文件夹。
确保您的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.py
,urls.py
位于project
文件夹中。 www
文件夹位于project
文件夹上方一级。
希望这至少可以节省你的星期天。