{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bokeh-Server\n", "\n", "Die Architektur von Bokeh ist so, dass übergeordnete *Modellobjekte*, also Darstellungen wie Plots, Bereiche, Achsen, Glyphen usw.) in Python erstellt und dann in ein JSON-Format konvertiert werden, das von der Client-Bibliothek `BokehJS` verwendet wird. Mit Hilfe des Bokeh-Servers können die *Modellobjekte* in Python und im Browser miteinander synchronisiert werden, wodurch mächtige Funktionen geschaffen werden:\n", "\n", "* Browser-Events führen zu serverseitigen Python-Berechnungen oder -Abfragen\n", "* Automatische Push-Aktualisierung des Browser-UI (z.B. Widgets oder Plots)\n", "* Periodische, Timeout- und asynchronen Callbacks für Streaming-Updates\n", "\n", "Diese Funktion zur Synchronisierung zwischen serverseitigem Python und dem Browser ist der Hauptzweck des Bokeh-Servers.\n", "\n", "Es ist auch möglich, Bokeh-Anwendungen zu definieren, indem ein Standard-Python-Skript erstellt wird. In diesem Fall ist es nicht erforderlich, eine Funktion wie `modify_doc` zu erstellen. Normalerweise erstellt das Skript einfach alle Bokeh-Kontingente und fügt es mit einer Zeile dem Dokument hinzu:\n", "\n", "``` Python\n", "curdoc().add_root(layout)\n", "```\n", "\n", "Um das Beispiel unten auszuprobieren, kopiert den Code in eine Datei `hello.py` und führt dann Folgendes aus:\n", "\n", "``` bash\n", "$ pipenv run python -m bokeh serve --show hello.py\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from bokeh.io import curdoc\n", "from bokeh.layouts import column\n", "from bokeh.models.widgets import Button, Paragraph, TextInput\n", "\n", "\n", "# create some widgets\n", "button = Button(label=\"Say Hi\")\n", "input = TextInput(value=\"Pythonistas\")\n", "output = Paragraph()\n", "\n", "\n", "# add a callback to a widget\n", "def update():\n", " output.text = \"Hello, \" + input.value + \"!\"\n", "\n", "\n", "button.on_click(update)\n", "\n", "# create a layout for everything\n", "layout = column(button, input, output)\n", "\n", "# add the layout to curdoc\n", "curdoc().add_root(layout)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.11 Kernel", "language": "python", "name": "python311" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 }