FastAPI-Integration
===================
Panel läuft üblicherweise auf einem :doc:`pyviz:bokeh/bokeh-server`, der
wiederum auf `Tornado `_ läuft. Es ist
jedoch auch oft nützlich, eine Panel-App in eine große Webanwendung einzubetten,
wie :abbr:`z.B. (zum Beispiel)` einen FastAPI-Webserver. Die Integration in
FastAPI ist einfacher im Vergleich zu anderen wie :abbr:`z.B. (zum Beispiel)`
:doc:`Flask `, da es ein leichtgewichtigeres
Framework ist. Die Verwendung von Panel mit FastAPI erfordert nur ein wenig mehr
Aufwand als bei Notebooks und Bokeh-Servern.
Konfiguration
-------------
Bevor wir mit dem Hinzufügen einer Bokeh-Anwendung zu unserem FastApi-Server
beginnen, müssen wir einige der grundlegenden Konfigurationen in
:download:`fastAPI/main.py` einrichten:
#. Zunächst importieren wir alle erforderlichen Elemente:
.. literalinclude:: fastAPI/main.py
:caption: fastAPI/main.py
:linenos:
:lines: 1-2, 4-6
#. Als nächstes definieren wir ``app`` als Instanz von ``FastAPI`` und
definieren den Pfad zum Vorlagenverzeichnis:
.. literalinclude:: fastAPI/main.py
:lineno-start: 8
:lines: 8-9
#. Nun erstellen wir unsere erste Routine über eine asynchrone Funktion und
verweisen sie an unseren Bokeh-Server:
.. literalinclude:: fastAPI/main.py
:lineno-start: 12
:lines: 12-17
#. Wie ihr dem Code ansehen könnt, wird ein `Jinja2
`_-Template
:download:`fastAPI/templates/base.html` erwartet. Dieses kann :abbr:`z.B.
(zum Beispiel)` folgenden Inhalt haben:
.. literalinclude:: fastAPI/templates/base.html
:caption: fastAPI/templates/base.html
:name: fastAPI/templates/base.html
:language: html
:linenos:
:lines: 1-
#. Kehren wir nun zurück zu unserer :download:`fastAPI/main.py`-Datei um mit
``pn.serve()`` unseren Bokeh-Server zu starten:
.. literalinclude:: fastAPI/main.py
:name: fastAPI/main.py
:lineno-start: 21
:lines: 21-
``createApp``
ruft in diesem Beispiel unsere Panel-App auf, die jedoch erst im nächsten
Abschnitt behandelt wird.
``address``, ``port``
Adresse und Port, an dem der Server auf Anfragen lauscht; in unserem Fall
also ``http://127.0.0.1:5000``.
:abbr:`Ggf. (Gegebenenfalls)` muss noch die Umgebungsvariable
``BOKEH_ALLOW_WS_ORIGIN`` gesetzt werden mit:
.. code-block:: console
$ export BOKEH_ALLOW_WS_ORIGIN=127.0.0.1:5000
``show=False``
sorgt dafür, dass der Bokeh-Server zwar gestartet wird, jedoch nicht
unmittelbar im Browser angezeigt wird.
``allow_websocket_origin``
listet die Hosts auf, die sich mit dem Websocket verbinden können. In
unserem Beispiel soll das ``fastApi`` sein, also verwenden wir
``127.0.0.1:8000``.
#. Nun definieren wir die ``sliders``-App auf Basis einer Standardvorlage für
FastAPI-Apps, die zeigt, wie Panel und FastAPI integriert werden können:
:download:`fastAPI/sliders/sinewave.py`
ein parametrisiertes Objekt, das euren bereits vorhandenen Code
darstellt:
.. literalinclude:: fastAPI/sliders/sinewave.py
:caption: fastAPI/sliders/sinewave.py
:name: fastAPI/sliders/sinewave.py
:linenos:
:lines: 1-
:download:`fastAPI/sliders/pn_app.py`
erstellt eine App-Funktion aus der ``SineWave``-Klasse:
.. literalinclude:: fastAPI/sliders/pn_app.py
:caption: fastAPI/sliders/pn_app.py
:name: fastAPI/sliders/pn_app.py
:linenos:
:lines: 1-
#. Schließlich kehren wir zu unserer :download:`fastAPI/main.py` zurück und
importieren die ``createApp``-Funktion:
.. literalinclude:: fastAPI/main.py
:caption: fastAPI/main.py
:lineno-start: 3
:lines: 3
Die Dateistruktur sollte nun folgendermaßen aussehen:
.. code-block:: console
fastAPI
├── main.py
├── sliders
│ ├── pn_app.py
│ └── sinewave.py
└── templates
└── base.html
Ihr könnt den Server nun starten mit:
.. code-block:: console
$ uv run uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['/srv/jupyter/jupyter-tutorial/docs/web/dashboards/panel/fastAPI']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [218214] using StatReload
Launching server at http://127.0.0.1:5000
INFO: Started server process [218216]
INFO: Waiting for application startup.
INFO: Application startup complete.
Anschließend solltet ihr im Web-Browser unter der URL ``http://127.0.0.1:8000``
folgendes sehen:
.. figure:: panel-fastapi.png
:alt: Widgets und Sinuskurve in Bokeh-Plot