Использование CherryPy / Cherryd для запуска нескольких экземпляров Flask

В предложениях по SO / SF и другим сайтам я использую CherryPy в качестве WSGI-сервера для запуска нескольких экземпляров веб-сервера Python, созданного с помощью Flask. Каждый экземпляр запускается на своем собственном порту и находится за Nginx. Я должен отметить, что нижеследующее работает для меня, но я обеспокоен тем, что я поступил неправильно, и он работает «случайно».

Вот мой текущий файл cherrypy.conf:

[global] server.socket_host = '0.0.0.0' server.socket_port = 8891 request.dispatch: cherrypy.dispatch.MethodDispatcher() tree.mount = {'/':my_flask_server.app} 

Не погружаясь слишком далеко в мой сервер Flask, вот как это начинается:

 import flask app = flask.Flask(__name__) @app.route('/') def hello_world(): return "hello" 

И вот команда, которую я выдаю в командной строке для запуска с Cherryd:

 cherryd -c cherrypy.conf -i my_flask_server 

Вопросы:

  1. Является ли упаковка Flask внутри CherryPy еще предпочтительным методом использования колбы в производстве? https://stackoverflow.com/questions/4884541/cherrypy-vs-flask-werkzeug

  2. Правильно ли это использовать файл .conf для запуска CherryPy и импорта приложения Flask? Я просмотрел документацию CherryPy, но я не могу найти варианты использования, которые соответствуют тому, что я пытаюсь сделать здесь конкретно.

  3. Является правильным способом запуска нескольких экземпляров CherryPy / Flask на одной машине для выполнения нескольких команд cherryd (демонанизация с помощью -d и т. Д.) С уникальными файлами .conf для каждого используемого порта (8891, 8892 и т. Д.)? Или есть лучший способ «CherryPy» для этого?

Спасибо за любую помощь и понимание.

2 Solutions collect form web for “Использование CherryPy / Cherryd для запуска нескольких экземпляров Flask”

Я не могу говорить за Flask, но могу для CherryPy. Это похоже на «правильный путь» … в основном. Эта строка о методе MethodDispatcher является no-op, поскольку она затрагивает только приложения CherryPy, и вы, похоже, не монтировали ни одного (вместо этого только одно приложение Flask).

Что касается пункта 3, у вас все в порядке. CherryPy позволяет запускать несколько объектов сервера в том же процессе, чтобы прослушивать несколько портов (или протоколов), но у него нет сахара для запуска нескольких процессов. Как вы говорите, несколько команд cherryd с различными конфигурационными файлами – как это сделать (если вы не хотите использовать более интегрированный инструмент управления кластером / конфигурацией, например eggmonster ).

Терминология: монтаж против трансплантации

В принципе, это правильный способ подавать приложение с фляжкой через вишневый, просто быструю заметку о вашем наименовании:

Здесь стоит отметить, что tree.mount не является ключом конфигурации сам по себе – tree приведет к cherrypy._cpconfig._tree_config_handler(k, v) с аргументами 'mount', {'/': my_flask_server.app} .

Ключевой параметр вообще не используется _tree_config_handler поэтому в вашем конфиге «mount» – это просто произвольная метка для этого конкретного файла сопоставлений пути. Он также не «монтирует» приложение (в конце концов, это не приложение CherryPy). Под этим я подразумеваю, что это не cherrypy.tree.mount(…) а скорее cherrypy.tree.graft s произвольный обработчик WSGI на ваше пространство имен «script-name» (пути, но в терминологии CherryPy).

Сообщение журнала Cherrypy несколько вводит в заблуждение: «Установлено <app as string> on /"]

Это несколько важный момент, поскольку с помощью трансплантата, в отличие от mount, вы не можете указать дополнительные параметры, такие как статическая файловая служба для вашего приложения или потоковые ответы на этом пути.

Поэтому я бы рекомендовал изменить tree.mount конфигурации tree.mount на что-то описательное, которое не приглашает слишком много читать семантику о том, что происходит внутри CherryPy (так как существует метод cherrypy.tree.mount ) из-за этой конфигурации. Например, tree.flask_app_name если вы просто сопоставляете это приложение в этом dict (может быть много директив tree , все они просто объединяются в пространство имен paths) или tree.wsgi_delegates если вы сопоставляете многие приложения в этом dict.

Использование CherryPy для обслуживания дополнительного контента без его приложения

Еще одно замечание: если вы хотите, чтобы cherrypy, например, предоставляла статическое файловое обслуживание для вашего приложения, вам не нужно создавать приложение с чернильным шаблоном для хранения этой конфигурации. Вам просто нужно установить None с соответствующей дополнительной конфигурацией. Достаточно было бы использовать следующие файлы, чтобы CherryPy служил статическому содержимому из подкаталога «статический», если они помещены в каталог, в котором вы запускаете cherryd для обслуживания статического содержимого (вызовите cherryd как cherryd -c cherrypy.conf -i my_flask_server -i static :

static.py

 import cherrypy # next line could also have config as an inline dict, but # file config is often easier to handle cherrypy.tree.mount(None, '/static-path', 'static.conf') 

static.conf

 # static.conf [/] tools.staticdir.on = True tools.staticdir.root = os.getcwd() tools.staticdir.dir = 'static' tools.staticdir.index = 'index.html' 
  • Как получить псевдоним URL-адреса в Python Flask?
  • Ошибка сборки с переменными и url_for в Flask
  • Безопасен ли сервер в комплекте с Flask для использования в производстве?
  • Как понять этот код фляжки?
  • Проводка JSON и python Flask - любые методы использования отладчика Werkzeug?
  • Parse X-Forwarded-For, чтобы получить ip с werkzeug на Heroku
  • Зачем использовать werkzeug, когда есть колба
  • Темы и локальный прокси в Werkzeug. Применение
  • Как безопасно получить реальный IP-адрес пользователя в Flask (используя mod_wsgi)?
  • Как я могу передать файл с помощью werkzeug?
  • Ищет обратный url_for в Flask
  • Python - лучший язык программирования в мире.