Как использовать приложение Flask в приложении Pyramid, которое использует route_prefix? - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь включить приборную панель, сделанную с помощью графика 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 серверу. Все это должно выполняться в одном и том же процессе.

...