Можно ли встроить Python REST API в существующее приложение? - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь расширить существующее приложение Python 3 для включения REST API. Я искал несколько дней, пытаясь выяснить, как сделать REST API подкомпонентом существующего приложения, но руководства, которые я нахожу для таких вещей, как Flask, Eve и т. Д., Не показывают, как запустить производство. API, если непосредственно не запущено само приложение API.

Я успешно добавил REST API Flask в свое приложение, и оно отвечает, как и ожидалось. Тем не менее, он работает таким образом, что не поддерживается и предположительно небезопасен, по крайней мере, по словам разработчиков. Когда я запускаю свое приложение, появляется предупреждающее сообщение о том, что вместо этого я должен использовать сервер WSGI:

 * Serving Flask app "api" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off

По общему признанию, я новичок в этом, поэтому я не уверен, что это значит или если / как это будет работать в моей ситуации. По сути, я пытаюсь сделать это:

import api as API

class Stuff(object):

  def setup(self):
    ...
    self.apiThread = API(...)

  def run(self):
    ...
    self.apiThread.start()  

Приложение большое, сложное, зрелое и стабильное, поэтому я не могу и / или не знаю, как заставить его работать в качестве подкомпонента приложения API, такого как this :

from werkzeug.wrappers import Request, Response

@Request.application
def application(request):
    return Response('Hello, World!')

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    run_simple('localhost', 4000, application)

Я видел руководства типа этого , которые помогли мне в некоторой степени понять внутренности веб-сервера, но я пока не могу найти производственное решение, которое имеет смысл для меня. Должен ли я реализовать класс, подобный тому, что показан на page 2 , и затем создать его экземпляр в потоке, как я показал в моем примере Stuff class? Будет ли это работать правильно, или я все еще что-то упустил?

Любое руководство будет с благодарностью.

Редактировать: gunicorn предложения кажутся общими и правильными для многих случаев использования - возможно, в том числе и моего - но я пока не понимаю, почему. Информация на странице gunicorn говорит об этом в первой строке:

If you want to deploy your Flask application to a WSGI server...

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

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

nginx вместе с gunicorn и flask являются распространенной комбинацией в мире Python. Здесь - это краткое объяснение того, почему вы не хотите использовать базовый сервер разработки (а здесь - это краткое руководство по настройке именно этого).Вы немного расплывчаты в своих целях, поэтому вам трудно рекомендовать что-то очень конкретное для вашего случая, но это безопасный, проверенный в бою и широко поддерживаемый подход.

Вы можете запустить сервер API и просто иметь различные флягинаправляет импорт и вызывает части вашего приложения по мере необходимости (например, маршрут /reload может вызывать любые методы, которые имеют смысл для перезагрузки конфигурации вашего приложения).

Еще лучший подход - запустить сервер API иваше приложение отдельно и установите канал связи между ними, используя какой-то традиционный IPC или, в зависимости от ваших потребностей, что-то вроде zeromq (примеры здесь ).

1 голос
/ 10 марта 2019

Ваши параметры зависят от того, что вы подразумеваете под «Делать его подкомпонентом существующего приложения».

В настоящее время у вас есть совершенно отдельное приложение, которое вы можете запустить, используя обычные серверы приложений, такие как Gunicorn ( эта статья также может помочь и в этом [упоминается @roganjosh]).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...