【发布时间】: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。如果您以这种方式为您的应用提供服务,那么(就您的代码而言)没有任何变化