【问题标题】:Is it possible to embed a Python REST API in an existing application?是否可以在现有应用程序中嵌入 Python REST API?
【发布时间】:2019-08-01 00:41:58
【问题描述】:

我正在尝试扩展现有的 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()  

该应用程序庞大、复杂、成熟且稳定,因此我无法和/或不知道如何使其作为 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)

我看过像this 这样的指南,它们在一定程度上帮助我理解了网络服务器的本质,但我还没有找到对我有意义的生产解决方案。我是否应该实现一个像page 2 上显示的类,然后像我在示例Stuff 类中显示的那样在线程中实例化它?这会正常工作还是我仍然错过了什么?

任何指导将不胜感激。

编辑:gunicorn 的建议对于许多用例来说似乎很常见且正确——可能包括我的——但我还不明白为什么。 gunicorn 页面上的信息在第一行说明了这一点:

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

我已经被卡住了,因为我还没有构建一个烧瓶应用程序。我在一个线程中运行一个烧瓶服务器,作为一个更大的应用程序的一个非常小的部分。我不明白如何翻转这个,可以这么说。

【问题讨论】:

  • 如果仅在内部使用,您可能可以忽略该警告
  • @roganjosh 这是一个内部应用程序,所以你说的是合乎逻辑的,这也是我暂时搁置这个问题的部分原因。但是,现在我有一些时间,我正在尝试“正确”地做到这一点。我真的很想了解我所问的是否可能,因为据我所知,这似乎是一种在线上没有详细说明的情况。要么没有人这样做,要么解决方案都是内部/定制的。
  • 哦,当然可以。使用gunicorn 启动。 flask.pocoo.org/docs/1.0/deploying
  • 那么您的意思是您在开发服务器上为您的应用程序提供服务,而您现在只关心 API?
  • 嗯,这正是我自己构建的。服务器负责将内容传输到前端。我开发了开发服务器,但主要应用程序使用 gunicorn。警告是关于开发服务器如何在并发请求上阻塞。要么忽略它,要么转向gunicorn。如果您以这种方式为您的应用提供服务,那么(就您的代码而言)没有任何变化

标签: python rest


【解决方案1】:

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

目前您有一个完全独立的应用程序,您可以使用 Gunicorn 等常见的应用程序服务器运行该应用程序(this article might helpthis 以及 [@roganjosh 提到的])。

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

【讨论】:

  • 抱歉,我尝试添加尽可能多的细节,所以我不确定哪种类型的信息对您最有帮助。从我在一分钟前发表的另一条评论中:“现在,当机器/VM 启动时,我正在运行一个 python 应用程序作为服务。它是一个与硬件(传感器、电机等)、数据库交互的广泛应用程序,和许多其他的东西。似乎用 gunicorn 启动某些东西意味着应用程序主要是一个网络服务器,但这里的情况并非如此。网络服务器/REST 服务器是一个更大的应用程序的一个小组件。”
  • 其他应用也是用python写的吗?
  • 这里有些问题,超出您的问题
  • @Anthony 这是完全合理的。我不是说不是。您的反对意见(如果我们这样称呼他们)没有意义。只需使用 gunicorn 启动 :)
  • 您可以在以seen here 启动系统后启动一个flask 应用程序。你也可以execute a code before the flask app have started
【解决方案2】:

nginxgunicornflask 是 Python 世界中的常见组合。 Here 是关于您为什么不想使用基本开发服务器的简短解释(here 是有关设置的简短教程)。您对自己的目标有点模糊,因此很难为您的案例推荐一些非常具体的东西,但这是一种安全、经过实战考验且得到广泛支持的方法。

您可以启动 API 服务器,并根据需要导入各种烧瓶路由并调用应用程序的某些部分(例如,/reload 路由可以调用任何对重新加载应用程序配置有意义的方法)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2012-12-24
    • 1970-01-01
    • 2011-06-18
    • 2021-06-10
    相关资源
    最近更新 更多