Py学习  »  Python

是否可以在现有应用程序中嵌入python rest api?

Anthony • 5 年前 • 1480 次点击  

我正在尝试扩展现有的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 这在某种程度上帮助我理解了web服务器的本质,但我还找不到一个对我有意义的生产解决方案。我是否应该实现一个类 page 2 然后在一个线程中实例化它,如我在示例中所示 Stuff 班级?那能正常工作吗?还是我还缺什么?

任何指导都将不胜感激。

编辑: gunicorn 对于许多用例来说,建议似乎是常见且正确的——可能包括我的——但是我还不明白为什么。关于 喷枪 佩奇在第一行这样说:

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/42926
 
1480 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Maurice
Reply   •   1 楼
Maurice    6 年前

您的选择取决于您所说的“使其成为现有应用程序的子组件”是什么意思。

目前你有一个完全独立的应用,你可以使用像Gunicorn这样的通用应用服务器运行它( this article might help this 以及[由@roganjosh提到]。

如果你想扩展你成熟的应用程序来包含这些,解决方案主要取决于你正在使用的现有应用程序和框架-如果你添加更多细节,我会尽力帮助你。

Nobilis
Reply   •   2 楼
Nobilis    6 年前

nginx 一起 gunicorn flask 是python世界中常见的组合。 Here 对于为什么不想使用基本开发服务器(以及 here 是一个关于设置的简短教程)。你对自己的目标有点模糊,所以很难为你的案例推荐一些非常具体的东西,但这是一种安全的、经过战斗测试的、广受支持的方法。

您可以启动api服务器,只需要根据需要导入和调用应用程序的各个flask路由(例如 /reload route可以调用任何对重新加载应用程序配置有意义的方法)。

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