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

В соответствии с предложениями на 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 по-прежнему предпочтительным методом использования Flask в производстве? https://stackoverflow.com/questions/4884541/cherrypy-vs-flask-werkzeug

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

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

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

Ответы [ 2 ]

5 голосов
/ 13 мая 2011

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

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

3 голосов
/ 23 мая 2013

Терминология: монтирование против прививки

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

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

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

Сообщение журнала Cherrypy несколько вводит в заблуждениеговорит "Установленon / "]

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

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

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

Еще одно замечание: если вы хотите, чтобы cherrypy, например, предоставляла статическую файловую службу для вашего приложения, вам не нужно создавать шаблонный cherrypyприложение для хранения этой конфигурации. Вам просто нужно смонтировать None с соответствующей дополнительной конфигурацией. Следующие файлы будутнеобходимо, чтобы CherryPy обслуживал статический контент из подкаталога «static», если он помещен в каталог, в котором вы запускаете 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'
...