【问题标题】:Dash deployed on apache server failing with "Dash object not callable"部署在 apache 服务器上的 Dash 因“Dash 对象不可调用”而失败
【发布时间】:2020-10-10 09:18:47
【问题描述】:

我正在尝试将 python dash 应用程序部署到我的 apache 服务器。我跟踪了我能找到的有关此配置的少量信息(officials docsthis troubleshooting thread was a bit better)。当我访问该网站时,页面返回一个500 Internal Server Error,在服务器错误日志中描述为"Dash object not callable"。这些是配置文件:

>> cat /var/www/html/wsgi/dashGAF.wsgi
#!/usr/bin/python
import sys
sys.path.insert(0,"/home/ubuntu/dashboards/")
from dashGAF import app as application
>> cat /etc/apache2/sites-available/dash.conf 
WSGIDaemonProcess dashGAF user=ubuntu group=ubuntu home=/home/ubuntu threads=5
WSGIScriptAlias /dashGAF /var/www/html/wsgi/dashGAF.wsgi
    <Directory /home/ubuntu/dashboards>
        WSGIProcessGroup dashGAF
            WSGIApplicationGroup %{GLOBAL}
            WSGIScriptReloading On
        Require all granted
    </Directory>
>> cat dashGAF.py
# -*- coding: utf-8 -*-
import dash
import dash_core_components as dcc
import dash_html_components as html

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets, routes_pathname_prefix='/dashGAF/')
server = app.server

app.layout = html.Div(children=[
    html.H1(children='Hello Dash'),

    html.Div(children='''
        Dash: A web application framework for Python.
    '''),

    dcc.Graph(
        id='example-graph',
        figure={
            'data': [
                {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'SF'},
                {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Montréal'},
            ],
            'layout': {
                'title': 'Dash Data Visualization'
            }
        }
    )
])

if __name__ == '__main__':
    app.run_server(debug=True, host='0.0.0.0')

当我在the_ip_address/dashGAF 访问我的dash 应用程序时,我得到一个500 Internal Server Error。检查我看到的error.log:

[Sat Jun 20 04:42:59.502528 2020] [wsgi:error] [pid 6064:tid 140622992238336] [client 118.210.193.245:50042] mod_wsgi (pid=6064): Exception occurred processing WSGI script '/var/www/html/wsgi/dashGAF.wsgi'.
[Sat Jun 20 04:42:59.502675 2020] [wsgi:error] [pid 6064:tid 140622992238336] [client 118.210.193.245:50042] TypeError: 'Dash' object is not callable

非常感谢您在解决此问题方面的任何帮助!此外,任何有关更改配置文件的建议都会有所帮助。

更多细节:

  • 我收到模块导入错误,例如 /var/log/apache2/error.log 中的以下内容:
[2020 年 6 月 20 日星期六 03:38:58.556219] [wsgi:error] [pid 583:tid 140297735726848] [client 118.210.193.245:55574] 文件“/home/ubuntu/dashboards/dashGAF.py”,第 2 行, 在 
[2020 年 6 月 20 日星期六 03:38:58.556265] [wsgi:error] [pid 583:tid 140297735726848] [client 118.210.193.245:55574] 导入破折号
[2020 年 6 月 20 日星期六 03:38:58.556285] [wsgi:error] [pid 583:tid 140297735726848] [client 118.210.193.245:55574] ImportError: No module named dash

我可以通过 sudo pip install dash==1.13.2 解决这个问题。

  • 我已经制作了所有的 *.py 和 *.wsgi 文件-rwxr-xr-x

  • 我使用sudo a2ensite dash.conf 启用了站点配置,并使用udo systemctl reload apache2 重新加载了配置。

  • 我相信正在运行的python版本是python2.7(基于apache error.log);不确定如何指定 2.7 或 3。

  • 如果我将 dashGAF.wsgi 编辑为 from dashGAF import server as application,我会收到 500 内部错误,但服务器日志中有以下详细信息:

[Sun Jun 21 06:33:28.181450 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221] mod_wsgi (pid=12237): Target WSGI script '/var/www/html/wsgi/dashGAF.wsgi' cannot be loaded as Python module.
[Sun Jun 21 06:33:28.181512 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221] mod_wsgi (pid=12237): Exception occurred processing WSGI script '/var/www/html/wsgi/dashGAF.wsgi'.
[Sun Jun 21 06:33:28.181545 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221] Traceback (most recent call last):
[Sun Jun 21 06:33:28.181577 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221]   File "/var/www/html/wsgi/dashGAF.wsgi", line 4, in <module>
[Sun Jun 21 06:33:28.181685 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221]     from dashGAF import server as application
[Sun Jun 21 06:33:28.181714 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221] ImportError: cannot import name server

可能有一个有用的细节,它说“目标 WSGI 脚本 '/var/www/html/wsgi/dashGAF.wsgi' 不能作为 Python 模块加载。” ??

  • 如果我将 dashGAF.wsgi 编辑为 application = app.server,我会收到 404 Not Found:
from dashGAF import app
application = app.server

【问题讨论】:

    标签: python apache mod-wsgi wsgi plotly-dash


    【解决方案1】:

    通常,您会在 wsgi 脚本中定位 Flask 服务器而不是 Dash 应用程序。也就是说,而不是

    from dashGAF import app as application
    

    应该是

    from dashGAF import server as application
    

    【讨论】:

    • 感谢您的建议...但是如果我将 *.wsgi 脚本编辑为 import server,我会收到该页面的 404 Not Found 错误。已相应地编辑了我的帖子...
    • 我再次测试,这次我得到一个不同的错误(不是 404 Not Found)。看起来它没有正确读取我的 wsgi 文件。我不知道为什么我第一次没有得到这个。我想知道是否应该对 wsgi 文件的每次更改都做一个systemctl reload apache2
    【解决方案2】:

    我有点犹豫是否应该回答我自己的问题。 @emher 的回答是问题的一部分——但不是整个解决方案。我需要解决一些问题,大部分故障排除是由@GrahamDumpleton 在github 指导的。如果他愿意,我很高兴他能提供答案。

    尽管如此,以下是需要解决的问题和修复:

    问题和修复:

    • 按照@emher 建议的from dashGAF import server as application 定位Flask 服务器
    • 没有必要包含routes_pathname_prefix,它将仪表板解析为https://ip.address/dashGAF/dashGAF`
    • /etc/apache2/sites-available/dash.conf 可以显着缩短`(见下文)
    • _dash-component-suites/dash_renderer/dash_renderer.dev.js 的请求失败,我必须将 requests_pathname_prefix='/dashGAF/' 选项添加到我的 app = dash.Dash 行 (see link on github)

    最终设置:

    /etc/apache2/sites-available/dash.conf

    WSGIDaemonProcess dashGAF user=ubuntu group=ubuntu home=/home/ubuntu threads=5
    WSGIScriptAlias /dashGAF /var/www/html/wsgi/dashGAF.wsgi
    
    WSGIProcessGroup dashGAF
    WSGIApplicationGroup %{GLOBAL}
    

    /var/www/html/wsgi/dashGAF.wsgi

    #!/usr/bin/python
    import sys
    sys.path.insert(0,"/home/ubuntu/dashboards/")
    from dashGAF import server as application
    

    仪表板/dashGAF.py 同上,但包括:

    app = dash.Dash(__name__, external_stylesheets=external_stylesheets, requests_pathname_prefix='/dashGAF/')
    server = app.server
    

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2021-05-22
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多