Я пытаюсь включить приборную панель, сделанную с помощью графика Da sh, внутри приложения Pyramid. Оказывается, Da sh использует Flask для создания своего приложения WSGI для обслуживания панели мониторинга. Поскольку все приложения WSGI используют один и тот же интерфейс вызова (environ
, response
), их можно составить. На самом деле я понял, как создать приложение Da sh в моем приложении Pyramid, используя pyramid.wsgi.wsgiapp2
. Вот очень простой пример:
import dash
import dash_html_components as html
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.wsgi import wsgiapp2
dash_app = dash.Dash(
__name__,
url_base_pathname='/dash/',
)
dash_app.layout = html.Div("Hello Dash")
def hello_world(request):
return Response('Hello World!')
with Configurator() as config:
config.add_route('hello', '/')
config.add_view(hello_world, route_name='hello')
config.add_route('dash', '/dash')
config.add_view(wsgiapp2(dash_app.server), route_name='dash') # <--- dash_app.server is the internal Flask app
app = config.make_wsgi_app()
if __name__ == "__main__":
from wsgiref.simple_server import make_server
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
Удивительно, но это прекрасно работает. К сожалению, в моей конкретной ситуации мне нужно использовать опцию route_prefix
на Configurator
с моим приложением Pyramid, так как оно будет включено как часть более крупного приложения, которое собирает дополнительные приложения Pyramid в один домен. По какой-то причине описанная выше структура не работает, когда вы используете route_prefix
, например так:
import dash
import dash_html_components as html
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.wsgi import wsgiapp2
dash_app = dash.Dash(
__name__,
url_base_pathname='/dash/',
)
dash_app.layout = html.Div("Hello Dash")
def hello_world(request):
return Response('Hello World!')
with Configurator(route_prefix='/myapp') as config: # <--- additional route component
config.add_route('hello', '/')
config.add_view(hello_world, route_name='hello')
config.add_route('dash', '/dash')
config.add_view(wsgiapp2(dash_app.server), route_name='dash')
app = config.make_wsgi_app()
if __name__ == "__main__":
from wsgiref.simple_server import make_server
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
Представление Pyramid hello_world
отлично работает с префиксом маршрута и доступно в /myapp/
, однако компонент Da sh возвращает 404
при /myapp/dash/
. Я попытался пошагово выполнить запрос и попытаться увидеть, куда добавляется префикс, но внутренности пирамиды чрезвычайно запутаны из-за использования zope.interface
, декораторов и частичных функций.
Любые идеи о том, как сделать это (с использованием других методов также приветствуется) будет принята с благодарностью. Единственное, что я не могу запустить отдельный сервер и просто прокси-сервер к Flask серверу. Все это должно выполняться в одном и том же процессе.