2017-02-25 204 views
6

昨天,我创建了这个帖子:DjangoRestFramework browsable api looks different locally vs when deployed on server?如何在部署Django应用程序时向AWS提供静态文件(`python manage.py collectstatic`不起作用)?

基本上,当我做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_ROOTsettings.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和回答说:

“然后,您需要通过你选择的Web服务器在settings.STATIC_URL服务settings.STATIC_ROOT,非常普遍的Nginx的背后反向代理您的Apache-mod_wsgi应用服务器“。

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

+0

你是否在任何时候运行''python manage.py collectstatic''? –

+0

@GrahamDumpleton是的,我在做'eb deploy'之前就做了。 (基本上,我是在本地做的,所有文件都放在静态文件夹中,然后我部署它)。 – user2719875

回答

9

有关于从RealPython部署django应用到AWS Elastic Beanstalk的权威指南 - here it is。 它有大约静态文件,以及如何与EB配置它整段,你并不需要了解的nginx /阿帕奇等

基本上你应该在你的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:如何调试缺少的静态文件。 我通常做到这一点(它涉及ssh方式连接到您的EB实例):

  1. 确保django.contrib.staticfiles包括在我的INSTALLED_APPS
  2. 检入浏览器控制台网址以找到丢失的文件 /static/js/somefile.js
  3. 请确保在我的django设置STATIC_URL是相同的,例如, /static/
  4. 检查STATIC_ROOT中的实际值,并检查该文件夹是否实际包含生产服务器中的静态文件。
  5. 检查我的EB配置指向正确的文件夹(下配置您的option_settings部分)

你也可以尝试收集静态到/static目录生产服务器上(这也正是EB寻找他们默认)。如果突然它开始工作 - 这意味着你的设置无法覆盖默认的设置,你应该检查它在哪里定义。

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

+0

感谢您的链接。所以我编辑了'settings.py',这样'STATIC_ROOT'和'STATIC_URL'就是你所说的。然后,我在'.ebextensions'文件夹中创建了一个名为'02_python.config'的文件,并将其粘贴到您在此发布的内容中。我把'iotd'改成'ebdjango'(我的项目名称..我的应用名称是'ebdjangoapp')。然后,我将'python ebjango/manage.py collectstatic --noinput'改为'python manage.py collectstatic --noinput'(因为python路径已经导入'ebdjango')。但它仍然不起作用(服务器仍然看起来像我发布的第二张图片)。任何想法如何调试这个问题? – user2719875

+0

回答更新可能的调试步骤,希望它会有所帮助。 – valignatev

+0

该更新帮助了很多!现在,当我让'STATIC_ROOT = os.path.join(BASE_DIR,“static”)'而不在我的'option_settings'配置文件中提及'staticfiles'时,它就起作用了(默认位置,正如你所提到的)!当我在'option_settings'中给''aws:elasticbeanstalk:container:python:staticfiles“'提供绝对或相对路径时,它也可以工作。但是当我将'STATIC_ROOT'改为'os.path.join(BASE_DIR,“..”,“www”,“static”)'并且在我的''/ option_settings',它为静态文件提供了一个404。当我让它等于'“/静态/”:“../ www /静态/”,它给静态403。 – user2719875

相关问题