是否可以在现有应用程序中嵌入Python REST API?

时间:2019-03-10 15:38:36

标签: python rest

我正在尝试扩展现有的Python 3应用程序以包括REST API。我一直在寻找几天,试图弄清楚如何使REST API成为现有应用程序的子组件,但是我在Flask,Eve等方面找到的指南并未显示如何运行生产API,除非API应用程序本身直接运行。

我已经成功地将Flask REST API添加到了我的应用程序中,并且它可以按预期进行响应。但是,至少在开发商看来,它的运行方式不受支持且据称不安全。当我运行我的应用程序时,会产生一条警告消息,提示我应该改用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()  

该应用程序庞大,复杂,成熟且稳定,因此我无法和/或不知道如何使其像this这样的API应用程序的子组件起作用:

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)

我看过类似this这样的指南,这些指南在某种程度上帮助我了解了网络服务器的精髓,但是我仍然找不到适合我的生产解决方案。我是否应该实现一个类似page 2所示的类,然后像在示例Stuff类中所示的那样在一个线程中实例化它?那能正常工作还是我仍然缺少什么?

任何指导将不胜感激。

编辑:gunicorn建议对于许多用例(可能包括我的用例)来说似乎是常见且正确的,但是我还不明白为什么。 gunicorn页上的信息在第一行显示:

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

我已经被困住了,因为我还没有构建一个Flask应用程序。我正在一个线程中运行Flask服务器,这是一个更大的应用程序的很小一部分。可以这么说,我不知道该如何翻转。

2 个答案:

答案 0 :(得分:2)

nginxgunicornflask一起是Python世界中的常见组合。 Here是关于您为什么不希望使用基本开发服务器的简短说明(而here是关于设置基本开发服务器的简短教程)。您对目标有些含糊,因此很难为您的案例推荐非常具体的方法,但这是安全,经过考验且得到广泛支持的方法。

您可以启动API服务器,并根据需要导入各种flask路由并调用应用程序的各个部分(例如,/reload路由可以调用任何方法来重新加载应用程序的配置)。< / p>

一种更好的方法是分别运行API服务器和应用程序,并使用一些传统的IPC来建立它们之间的通信通道,或者根据您的需要,使用zeromq之类的示例(例如{{3} }。

答案 1 :(得分:1)

您的选择取决于“将其作为现有应用程序的子组件”的含义。

当前,您有一个完全独立的应用程序,可以使用诸如Gunicorn(this article might helpthis [[roganjosh]提及)之类的常见App Server运行。

如果您想扩展成熟的应用程序以包括此功能,则解决方案主要取决于现有应用程序和所使用的框架-如果您添加更多详细信息,我会尽力提供帮助。