Модулирование серверов Bokeh в Flask

У меня есть множество файлов Bokeh Server в каталоге, скажем .. /dir/bokeh/, предположим, что серверы bokeh называются bokeh1.py, bokeh2.py, bokeh3.py

Структура файла примерно такая:

|--dir
    |---flask.py
    |---bokeh
          |--bokeh1.py
          |--bokeh2.py

Я развертываю их все на фляге следующим образом:

files=[]
for file in os.listdir("/dir/bokeh/"):
    if file.endswith('.py'):
        file="bokeh/"+file
        files.append(file)

argvs = {}
urls = []
for i in files:
    argvs[i] = None
    urls.append(i.split('\\')[-1].split('.')[0])
host = 'myhost.com'

apps = build_single_handler_applications(files, argvs)

bokeh_tornado = BokehTornado(apps, extra_websocket_origins=["myhost.com"])
bokeh_http = HTTPServer(bokeh_tornado)
sockets, port = bind_sockets("myhost.com", 0)
bokeh_http.add_sockets(sockets)

Затем для каждого боке-сервера у меня есть flask.py:

@app.route("/bokeh1")
    def bokeh1():
    bokeh_script = server_document("http://11.111.11.111:%d/bokeh1" % port) 
    return render_template("bokserv.html", bokeh_script=bokeh_script)

Количество боке-серверов, которые мне нужно развернуть, может быстро вырасти. Как я могу написать что-то, что будет эффективно генерировать @app.route для каждого боке bokeh1.py, bokeh2.py, bokeh3.py на основе моих текущих настроек? Сервер работает на Ubuntu


person machump    schedule 09.05.2018    source источник


Ответы (1)


Вы можете создать все функции в цикле:

def serve(name):
    @app.route("/{}".format(name))
    def func():
        bokeh_script = server_document("http://11.111.11.111:%d/%s" % (port, name))
        return render_template("bokserv.html", bokeh_script=bokeh_script)

    func.__name__ = name
    return func

all_serve_functions = [serve(name) for name in all_names]
person HYRY    schedule 10.05.2018
comment
по какой-то причине он возвращает: «Отображение функции просмотра перезаписывает существующую функцию конечной точки: func». Что может быть причиной этого? - person machump; 10.05.2018
comment
Новая находка. Вы должны установить параметр endpoint в строке app.route. На всякий случай убедитесь, что name не включает расширение .py. - person machump; 10.05.2018