Shinyproxy: Problem mit Deploy-Dash > 1.1 auf Shinyproxy 2.3.1

Erstellt am 25. Sept. 2020  ·  9Kommentare  ·  Quelle: openanalytics/shinyproxy

Hallo Gemeinde,

Ich versuche, eine Dash-App (neueste Version) mit Shinyproxy bereitzustellen. Es scheint, dass die letzten erfolgreichen Strich/Strich-Abhängigkeiten, die mit Shinyproxy funktionieren, folgende sind:

Bindestrich 1.1.1
Dash-Bootstrap-Komponenten 0.7.1
Dash-Core-Komponenten 1.1.1
dash-html-komponenten 1.0.0
Dash-Renderer 1.0.0
Dash-Tabelle 4.1.0

Ich habe ein paar Fixes ausprobiert, um es ohne Glück zu starten, von denen keine mit Dash > 1.1.0 funktioniert. Ich füge die bekannten Lösungen hinzu, die ich bisher ausprobiert habe:

Methode 1:
app = dash.Dash(__name__, requests_pathname_prefix='/app_direct/dash-demo/')

Methode 2:

app = dash.Dash(external_stylesheets=[dbc.themes.BOOTSTRAP], 
suppress_callback_exceptions=True, 
prevent_initial_callbacks=True, 
requests_pathname_prefix='/app_direct/<appname>')
#app.config.update({
#         # remove the default of '/'
#         'routes_pathname_prefix': '',
#         # remove the default of '/'
#         'requests_pathname_prefix': ''
#    })

Ich habe versucht, __name__ und/oder external_stylesheets auszuschließen
Ich habe auch erfolglos versucht, die Anfrage in das config.update zu verschieben:

app.config.update({
         # remove the default of '/'
         'routes_pathname_prefix': '',
         # remove the default of '/'
         'requests_pathname_prefix': '/app_direct/<appname>/'
})

Als Referenz führen diese Lösungen immer dazu, dass keine dieser Komponenten geladen wird:

[email protected]_6_0m1598451932.8.7.min.js
[email protected]_6_0m1598451932.13.0.min.js
[email protected]_6_0m1598451932.13.0.min.js
[email protected]_6_0m1598451932.7.2.min.js
dash_bootstrap_components.v0_10_3m1598451933.min.js
bundle.v4_9_0m1598451932.js
dash_html_components.v1_0_3m1598451932.min.js
dash_core_components.v1_10_2m1598451932.min.js
dash_core_components-shared.v1_10_2m1598451932.js
dash_renderer.v1_6_0m1598451932.min.js
[email protected]_6_0m1598451932.13.0.min.js
[email protected]_6_0m1598451932.7.2.min.js
dash_bootstrap_components.v0_10_3m1598451933.min.js
bundle.v4_9_0m1598451932.js
dash_html_components.v1_0_3m1598451932.min.js
dash_core_components.v1_10_2m1598451932.min.js
dash_core_components-shared.v1_10_2m1598451932.js
dash_renderer.v1_6_0m1598451932.min.js

Ich würde mich über jede Hilfe bei diesem Problem freuen.

enhancement

Hilfreichster Kommentar

Ich sehe jetzt, dass diese Lösung exklusiv für> 1.1 ist und keine allgemeine Lösung für alle Versionen von Dash.

Ich habe diesen Fix jetzt mit Dash-Demo und einer zweiten komplexeren Anwendung reproduziert. Vielen Dank für Ihre Hilfe.

Alle 9 Kommentare

UPDATE: Dash 1.17.0 und ShinyProxy 2.4.1 scheinen es geschafft zu haben.
Benötigt nur:

server = flask.Flask(__name__)

app = dash.Dash(
    __name__, 
    external_stylesheets=[dbc.themes.BOOTSTRAP], 
    suppress_callback_exceptions=True,
    server = server,
    requests_pathname_prefix='/app_direct/<appname>/'
)

Ich kann diesen Fix mit Dash 1.17.0 und ShinyProxy 2.4.1 nicht reproduzieren. Die Dash-Demo funktioniert gut mit älteren Dash-Versionen, aber mir ist nicht klar, wie die obige Lösung für die Dash-Demo implementiert werden soll:

https://github.com/openanalytics/shinyproxy-dash-demo

Können Sie weitere Einzelheiten angeben?

UPDATE: Dash 1.17.0 und ShinyProxy 2.4.1 scheinen es geschafft zu haben.
Benötigt nur:

app = dash.Dash(
    __name__, 
    external_stylesheets=[dbc.themes.BOOTSTRAP], 
    suppress_callback_exceptions=True,
    server = server,
    requests_pathname_prefix='/app_direct/<appname>/'
)

Hallo @jtpoirier

Beim Erstellen einer Dash-Anwendung können Sie einige Parameter angeben. Damit Dash ordnungsgemäß mit ShinyProxy funktioniert, müssen Sie zwei Parameter mit demselben Wert angeben. Diese Parameter sind:

  • routes_pathname_prefix
  • requests_pathname_prefix

Der Wert dieser Parameter sollte wie folgt sein:

/app_direct/<appname>/

Sie müssen appname durch die ID der App ersetzen, die Dash verwendet. Um dies zu verdeutlichen, hier ein vollständiges Beispiel:
Angenommen, Sie haben die folgende application.yml -Datei:

proxy:
  title: Open Analytics Shiny Proxy
  logo-url: https://www.openanalytics.eu/shinyproxy/logo.png
  landing-page: /
  heartbeat-rate: 10000
  heartbeat-timeout: 60000
  port: 8080
  authentication: simple
  admin-groups: scientists
  users:
  - name: jack
    password: password
    groups: scientists
  - name: jeff
    password: password
    groups: mathematicians
  docker:
    cert-path: /home/none
    url: http://localhost:2375
    port-range-start: 20000
  specs:
   - id: dash-demo # Note: this is the id of the application
     display-name: Dash Demo Application
     port: 8050
     container-cmd: ["python", "app.py"]
     container-image: openanalytics/shinyproxy-dash-demo

Dann ist die ID der Anwendung dash-demo , und somit wird der Wert des Parameters zu:

/app_direct/dash-demo/

Oben in Ihrer Dash-Anwendung haben Sie wahrscheinlich den folgenden Python-Code:

app = dash.Dash(
    __name__, 
    external_stylesheets=[dbc.themes.BOOTSTRAP], 
    suppress_callback_exceptions=True,
    server = server,
    requests_pathname_prefix='/app_direct/dash-demo/',
   routes_pathname_prefix='/app_direct/dash-demo/'
)

Ich hoffe das ist verständlich und hilft. Viel Glück!

Hallo @jfrubioz

Wir haben eine Änderung vorgenommen, die in der nächsten ShinyProxy-Version enthalten sein wird, um die Arbeit mit Dash-Apps zu vereinfachen. Ab dieser Version hat jede ShinyProxy-App eine Umgebungsvariable SHINYPROXY_PUBLIC_PATH , die im Grunde den Wert enthält, den Sie in Ihrer Problemumgehung angegeben haben. Für das obige Beispiel wäre das also /app_direct/dash-demo/ .
Der Vorteil ist, dass Sie Ihre Dash-Anwendungen unabhängig von dem in ShinyProxy verwendeten App-Namen machen können.
Übrigens: Wir werden auch eine Möglichkeit bieten, diesen Wert an eine beliebige Umgebungsvariable zu binden, um Apps wiederum unabhängiger von ShinyProxy zu machen.

Danke für die schnellen Antworten. Es hört sich so an, als würde Ihre geplante Verbesserung helfen.

Der obige Code scheint dash-demo mit der neuesten Version von Dash nicht erfolgreich zu starten, möglicherweise aus mehreren Gründen. "server" ist in der dash-demo app.py nicht definiert, daher wird es nicht ausgeführt. Wenn diese Zeile entfernt wird, startet die App in der Befehlszeile wie unten, aber der Container antwortet nie rechtzeitig über die Webschnittstelle. Um es klar zu sagen, die Dash-Demo funktioniert in dieser Umgebung gut mit Dash ≤ 1.1.

Running on http://0.0.0.0:8050/app_direct/dash-demo/
Debugger PIN: 394-772-284
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
Running on http://0.0.0.0:8050/app_direct/dash-demo/
Debugger PIN: 807-835-959

@jtpoirier

Ja, mir ist aufgefallen, dass ich keinen Verweis auf den Server eingefügt habe. Ich habe das Update so aktualisiert, dass es die Zeile server = flask.Flask(__name__) enthält. Stellen Sie sicher, dass Sie die Flasche in Ihr Modul importieren.

Wie @LEDfan erklärte, beruht die Lösung einfach auf dem Hinzufügen von „/app_direct/dash-demo/“ zu Ihrem „requests_pathname_prefix“. Aber ich glaube nicht, dass Sie es auch in 'routes_pathname_prefix' eingeben müssen. Daher würde ich nur sicherstellen, dass Ihr Python-Code so aussieht:

app = dash.Dash(
    __name__, 
    external_stylesheets=[dbc.themes.BOOTSTRAP], 
    suppress_callback_exceptions=True,
    server = flask.Flask(__name__),
    requests_pathname_prefix='/app_direct/dash-demo/',
)

if __name__ == '__main__':
    app.run_server( 
           #make sure you have the right host address
           #host = '0.0.0.0',
    )

Beginnend mit der neuesten Dash-Demo-Version habe ich die Zeile „app=dash.Dash()“ wie vorgeschlagen durch den folgenden Code ersetzt. Auch hier wird der Server in der Befehlszeile ausgeführt, aber wenn er von Shinyproxy gestartet wird, läuft das Zeitlimit ab. Ich bestätige, dass die ID der App in meiner Datei „application.yml“ „dash-demo“ lautet.

import flask

app = dash.Dash(
    __name__, 
    suppress_callback_exceptions=True,
    server=flask.Flask(__name__),
    requests_pathname_prefix='/app_direct/dash-demo/'
)

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

Ich sehe jetzt, dass diese Lösung exklusiv für> 1.1 ist und keine allgemeine Lösung für alle Versionen von Dash.

Ich habe diesen Fix jetzt mit Dash-Demo und einer zweiten komplexeren Anwendung reproduziert. Vielen Dank für Ihre Hilfe.

Hallo @jtpoirier , toll, dass du das Problem lösen konntest!

@jfrubioz wir haben ShinyProxy 2.5.0 veröffentlicht, in dem jeder Container jetzt die Umgebung SHINYPROXY_PUBLIC_PATH hat. Wie Sie in unserer Demo sehen können, sollte es jetzt einfacher sein, neuere Dash-Versionen zu unterstützen.
Vielen Dank, dass Sie uns die Lösung beigesteuert haben!

Da dies nun behoben ist, schließe ich dieses Thema. Fühlen Sie sich wie immer frei, ein neues Problem zu eröffnen, wenn Sie auf ein Problem stoßen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen