Мы используем Flask для маршрутизации пользователей на серверы Bokeh. Система работает внутри образа Docker. Все работает хорошо. Но теперь мы хотим добавить аутентификацию, что оказывается трудным, потому что мы не хотим сопоставлять порты сервера bokeh с клиентом.
Позвольте мне показать вам, как это работает в настоящее время (без аутентификации):
Flask app.py (маршрутизация):
...
@app.route('/folder/report_x')
def page_folder_report_x():
''' embedded bokeh server for report_x '''
script = server_document('http://localhost:5001/report_x')
resp = {
'title': 'Report X',
'script': script,
'template': 'Flask', }
return render_template('embed.html', **resp)
...
app.run(host='0.0.0.0', port=5000, use_reloader=False)
Flask embed.py (шаблон):
...
{% extends "base.html" %}
{% block content %}
{{ script|safe }}
{% endblock %}
...
Сервер Bokeh запускается с помощью панели Python из командной строки (localhost: 5000 представляет собой сервер Flask):
panel serve report_x --port 5001 --allow-websocket-origin localhost:5000
Сервер Bokeh обслуживается с помощью файла main.ipynb:
import panel as pn
from bokeh.models import ColumnDataSource, CustomJS
from bokeh.models.widgets import Button, DataTable, PreText
from bokeh.models.widgets import TableColumn, NumberFormatter, DateFormatter
...
gspec = pn.GridSpec(sizing_mode='stretch_both')
gspec[0:12, 0:12] = pn.WidgetBox(widgets)
...
gspec.servable()
Наш образ Docker показывает порты сервера flask и сервера (ов) боке:
...
RUN pip install -r /app/requirements.txt
EXPOSE 5000:5000
EXPOSE 5001:5001
...
Наконец, когда мы запускаем контейнер докеров, мы сопоставляем порты:
# success!
docker run -p 5000:5000 -p 5001:5001 report_server:0.1
Если мы запустим образ докера таким образом, все будет работать отлично.
Но если мы запустим его без сопоставления сервера боке, мы не сможем связаться с сервером боке (даже если он доступен внутри, как вы можете видеть в DockerFile):
# fail
docker run -p 5000:5000 report_server:0.1
В целях безопасности мы хотим сопоставить только один порт с внешним миром. Есть ли что-то, что нам не хватает о том, как встроить серверы Bokeh в Flask, что позволило бы только Flask взаимодействовать с сервером Bokeh?