gpt4 book ai didi

python - 等待值然后停止服务器,在 'werkzeug.server.shutdown' 被弃用并删除之后

转载 作者:行者123 更新时间:2023-12-05 04:46:19 29 4
gpt4 key购买 nike

为了在我的本地非 Web 应用程序中使用 OAuth API,我将用户发送到浏览器中服务的 OAuth 登录,然后临时启动 Flask 服务器以监听本地主机上的 OAuth token 请求。在路由中,我调用 shutdown 来终止临时服务器:

token = request.args["token"]
shutdown = request.environ["werkzeug.server.shutdown"]
shutdown()

从 Flask 2.0 和 Werkzeug 2.0 开始,开发服务器 shutdown 功能已弃用。调用它时,显示以下消息:

The 'environ['werkzeug.server.shutdown']' function is deprecated and will be removed in Werkzeug 2.1.

许多 Stack Overflow 答案建议使用 werkzeug.server.shutdown,但没有生产 WSGI 服务器记录如何执行此操作。如何启动服务器、等待单个请求、存储值,然后终止服务器?

最佳答案

我在 Shutting Down the Server 中写了一个替代方案Werkzeug 文档的一部分。这使用 multiprocessing.Process 启动并等待子进程,然后在接收到的值通过 multiprocessing.Queue 传回后终止子进程。

import multiprocessing
from werkzeug import Request, Response, run_simple

def run_token_server(q: multiprocessing.Queue) -> None:
@Request.application
def app(request: Request) -> Response:
q.put(request.args["token"])
return Response("", 204)

run_simple("localhost", 5000, app)


def get_token():
q = multiprocessing.Queue()
p = multiprocessing.Process(target=run_token_server, args=(q,))
p.start()
token = q.get(block=True)
p.terminate()
return token

您可以通过将以下内容添加到底部,然后使用 python 运行该文件来查看此工作:

if __name__ == "__main__":
print(get_token())

导航到 http://localhost:5000/?token=test 将打印 test 并退出。


我在 deprecation discussion 中展示的另一个类似的替代方案是使用threading.Threadmake_server() 代替。同上可以证明。

import threading
from queue import Queue

from werkzeug import Request, Response
from werkzeug.serving import make_server


def get_token():
@Request.application
def app(request):
q.put(request.args["token"])
return Response("", 204)

q = Queue()
s = make_server("localhost", 5000, app)
t = threading.Thread(target=s.serve_forever)
t.start()
token = q.get(block=True)
s.shutdown()
t.join()
return token

对于 Waitress ,将在 Windows 和 Linux 上运行的生产 WSGI 服务器,方法几乎相同。将 run_simple() 替换为 waitress.serve():

waitress.serve(app, host="localhost", port=5000)

或者对于线程方法,使用 waitress.create_server()s.close():

s = waitress.create_server(app, host="localhost", port=5000)
t = threading.Thread(target=s.run)
...
s.close()
...

关于python - 等待值然后停止服务器,在 'werkzeug.server.shutdown' 被弃用并删除之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68885585/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com