【问题标题】:Internal Server Error: Dash on Flask on AWS Elastic Beanstalk内部服务器错误:AWS Elastic Beanstalk 上的 Flask 上的 Dash
【发布时间】:2018-11-01 14:16:48
【问题描述】:

注意: Dash 是一个 python 包,用于通过 plotly 构建仪表板(网站here)。 Flask 是一个用于构建 python web 框架的 python 包(网站here 和 AWS 教程here)。我正在使用 python 3.6,所有软件包版本都可以在下面的 requirements.txt 中看到

问题:在我的 AWS EB 上启动我的 Dash 应用程序时出现错误。

当我在 127.0.0.1:8050 本地运行时,我的破折号工作。然而,当我 $ eb deploy 我在我的 AWS EB URL 上得到这个:

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求。

请通过 root@localhost 联系服务器管理员,告知他们此错误发生的时间,以及您在此错误之前执行的操作。

服务器错误日志中可能会提供有关此错误的更多信息。

我的文件结构是这样的(eb-flask 是我的烧瓶目录):

~/AWS/servers/flask-s
  |-- eb-virt                   }
  |    |-- bin                  }
  |    |-- include              } virtualenv files etc
  |    |-- lib                  }
  |    `-- pip-selfcheck.json   }
  |
  |-- eb-flask              <--- where I ran eb init
  |    |-- application.py
  |    |-- requirements.txt
  |    |-- .gitignore
  |    |-- .elasticbeanstalk
  `         `-- config.yml

使用$ eb config时:

aws:elasticbeanstalk:container:python:
  NumProcesses: '1'
  NumThreads: '15'
  StaticFiles: /static/=static/
  WSGIPath: application.py

我的 application.py 代码几乎是从 https://dash.plot.ly/deployment 中提取出来的。

import flask
import os
import dash
import dash_core_components as dcc
import dash_html_components as html

#app = dash.Dash(_name_)
#server = app.server

server = flask.Flask(_name_)
application = dash.Dash(_name_, server=server)

application.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})

application.layout = html.Div([
    html.H2('Hello World'),
    dcc.Dropdown(
        id='dropdown',
        options=[{'label': i, 'value': i} for i in ['LA', 'NYC', 'MTL']],
        value='LA'
    ),
    html.Div(id='display-value')
])

@application.callback(dash.dependencies.Output('display-value', 'children'),
              [dash.dependencies.Input('dropdown', 'value')])
def display_value(value):
return 'You have selected "{}"'.format(value)

if _name_ == '_main_':
    application.run_server(debug=True)
#app.run_server()

requirements.txt 显然是 pip freeze 。此时它只是flask、dash和plotly所需的包:

certifi==2018.4.16
chardet==3.0.4
click==6.7
dash==0.21.1
dash-core-components==0.22.1
dash-html-components==0.10.1
dash-renderer==0.12.1
decorator==4.3.0
Flask==1.0.2
Flask-Compress==1.4.0
gunicorn==19.8.1
idna==2.6
ipython-genutils==0.2.0
itsdangerous==0.24
Jinja2==2.10
jsonschema==2.6.0
jupyter-core==4.4.0
MarkupSafe==1.0
nbformat==4.4.0
numpy==1.14.3
pandas==0.23.0
plotly==2.6.0
python-dateutil==2.7.3
pytz==2018.4
requests==2.18.4
six==1.11.0
traitlets==4.3.2
urllib3==1.22
Werkzeug==0.14.1

服务器端显然有问题。当我运行(eb-virt) $ python application.py 时,我可以在本地访问该站点。我从 HTTP GET 得到这个响应:

(eb-virt): eb-flask $ python application.py 
 * Serving Flask app "application" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:8050/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 190-847-760
127.0.0.1 - - [22/May/2018 18:41:30] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [22/May/2018 18:41:31] "GET /_dash-layout HTTP/1.1" 200 -
127.0.0.1 - - [22/May/2018 18:41:31] "GET /_dash-dependencies HTTP/1.1" 200 -
127.0.0.1 - - [22/May/2018 18:41:31] "POST /_dash-update-component HTTP/1.1" 200 -
127.0.0.1 - - [22/May/2018 18:41:31] "GET /favicon.ico HTTP/1.1" 200 -

然而,当我$ eb deploy 时,我得到了前面提到的内部服务器错误。感谢您的帮助。

当我enable logging 时,我在本地得到application.logger.addHandler(handler) AttributeError: 'Dash' object has no attribute 'logger'。部署时,日志文件没有附加任何错误,它只是保持空白。

【问题讨论】:

  • 您在/opt 中有python 文件夹吗?
  • @Jack 只是想知道你是否发现了这一点,我也遇到了类似的问题
  • 我改变了策略:我将 dash 应用程序移动到 init.py 中,如下所示:def create_app(test_config=None): app = Flask(__name__, instance_relative_config=True) dashapp = dash.Dash(__name__, server=app, url_base_pathname='/dashapp') dashapp.layout = &lt;DASH LAYOUT CODE&gt; 然后我创建了一条路线:@app.route('/dash', methods=['GET', 'POST']) def dash_one(): return redirect('/dashapp') 当我去网址/破折号
  • 注意:仅在本地工作。我仍在尝试上传到 AWS
  • 它对你有用吗?我也面临同样的问题

标签: python amazon-web-services flask amazon-elastic-beanstalk


【解决方案1】:

我认为名称“应用程序”有混淆 这对我有用: 应用程序 = flask.Flask(名称)

app = dash.Dash(__name__, external_stylesheets=external_stylesheets,server=application)

【讨论】:

    【解决方案2】:

    我认为问题在于application.run_server(debug=True) 方法将localhost 作为默认主机。这意味着应用程序部署到127.0.0.1,您只能从运行它的机器内部访问它。这解释了为什么您只能在本地访问应用程序(无论是从您的计算机还是在实例内部)。部署到 Elastic Beanstalk 时,您需要将主机指定为 0.0.0.0 - 所有 IP 地址(不鼓励在生产中使用 debug=True 进行部署!):

    if __name__ == '__main__':
        app.run_server(host="0.0.0.0")
    

    检查thisGitHub 示例 Flask 应用程序 Beanstalk 部署。

    【讨论】:

      猜你喜欢
      • 2020-02-20
      • 2019-01-27
      • 2020-10-28
      • 1970-01-01
      • 2016-03-07
      • 2021-09-22
      • 1970-01-01
      • 2020-08-02
      • 2020-08-13
      相关资源
      最近更新 更多