Da sh развернут на apache сервере, произошел сбой "Da sh object not callable" - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь развернуть приложение python da sh на моем apache сервере. Я следил за скудным объемом информации об этой конфигурации, которую смог найти ( официальные документы ; этот поток устранения неполадок был немного лучше ). Когда я захожу на веб-сайт, страница возвращает 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')

Когда я захожу в приложение da sh по адресу the_ip_address/dashGAF, я получаю 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:
[Sat Jun 20 03:38:58.556219 2020] [wsgi:error] [pid 583:tid 140297735726848] [client 118.210.193.245:55574]   File "/home/ubuntu/dashboards/dashGAF.py", line 2, in <module>
[Sat Jun 20 03:38:58.556265 2020] [wsgi:error] [pid 583:tid 140297735726848] [client 118.210.193.245:55574]     import dash
[Sat Jun 20 03:38:58.556285 2020] [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 Foun:
from dashGAF import app
application = app.server

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Обычно в сценарии wsgi вы выбираете сервер Flask, а не приложение Da sh. То есть вместо

from dashGAF import app as application

должно быть

from dashGAF import server as application
0 голосов
/ 02 июля 2020

Я немного колебался, стоит ли отвечать на свой вопрос. Ответ @emher был частью проблемы, но не полным решением. Мне нужно было исправить несколько проблем, и большая часть этих проблем проводилась при помощи @GrahamDumpleton на github . Я более чем счастлив, что он даст ответ, если он захочет.

Тем не менее, вот проблемы и исправления, которые должны были возникнуть:

проблемы и исправления:

  • Настройте таргетинг на сервер Flask, как предложил @emher с from dashGAF import server as application
  • , не обязательно включать 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 ( см. ссылку на github )

окончательная настройка:

/ etc / apache2 / sites- available / da sh .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

dashboards / dashGAF.py То же, что и выше, но включает:

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