我正在尝试扩展现有的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服务器,这是一个更大的应用程序的很小一部分。可以这么说,我不知道该如何翻转。
答案 0 :(得分:2)
nginx
与gunicorn
和flask
一起是Python世界中的常见组合。 Here是关于您为什么不希望使用基本开发服务器的简短说明(而here是关于设置基本开发服务器的简短教程)。您对目标有些含糊,因此很难为您的案例推荐非常具体的方法,但这是安全,经过考验且得到广泛支持的方法。
您可以启动API服务器,并根据需要导入各种flask路由并调用应用程序的各个部分(例如,/reload
路由可以调用任何方法来重新加载应用程序的配置)。< / p>
一种更好的方法是分别运行API服务器和应用程序,并使用一些传统的IPC来建立它们之间的通信通道,或者根据您的需要,使用zeromq之类的示例(例如{{3} }。
答案 1 :(得分:1)
您的选择取决于“将其作为现有应用程序的子组件”的含义。
当前,您有一个完全独立的应用程序,可以使用诸如Gunicorn(this article might help和this [[roganjosh]提及)之类的常见App Server运行。
如果您想扩展成熟的应用程序以包括此功能,则解决方案主要取决于现有应用程序和所使用的框架-如果您添加更多详细信息,我会尽力提供帮助。