jfo*_*cht 50 python ubuntu flask python-2.7
我想在一个烧瓶应用程序中发送一个本地REST请求,如下所示:
from flask import Flask, url_for, request
import requests
app = Flask(__name__)
@app.route("/<name>/hi", methods=["POST"])
def hi_person(name):
form = {"name": name}
return requests.post(url_for("hi", _external=True), data=form)
@app.route("/hi", methods=["POST"])
def hi():
return 'Hi, %s!' % request.form["name"]
Run Code Online (Sandbox Code Playgroud)
发送curl -X POST http://localhost:5000/john/hi导致整个烧瓶应用程序冻结.当我发送一个kill信号时,我的管道出现故障.有没有办法防止烧瓶在这里冻结?
Mar*_*ers 109
在能够处理并发请求(可能是gunicorn或uWSGI)的适当WSGI服务器下运行您的烧瓶应用程序,它将工作.在开发时,在Flask提供的服务器中启用线程:
app.run(threaded=True)
Run Code Online (Sandbox Code Playgroud)
但请注意,不建议将Flask服务器用于生产用途.从Flask 1.0开始,threaded默认情况下已启用,并且您flask确实希望在命令行上使用该命令来运行您的应用程序.
会发生的是使用请求您向烧瓶应用程序发出第二个请求,但由于它仍在忙于处理第一个请求,因此在完成第一个请求之前,它不会响应第二个请求.
顺便说一句,在Python 3下,socketserver实现更优雅地处理断开连接并继续服务而不是崩溃.
Cor*_*bin 19
这里有几件事情,我会尝试一次一个地解决它们.
首先,您可能正在使用玩具开发服务器.这台服务器有很多局限性; 主要是这些限制之一是它一次只能处理一个请求.当您在第一次请求期间创建第二个请求时,您正在锁定您的应用程序:该requests.post()函数正在等待Flask响应,但Flask本身正在等待post()返回!此特定问题的解决方案是在多线程或多进程环境中运行WSGI应用程序.我更喜欢http://twistedmatrix.com/trac/wiki/TwistedWeb,但还有其他一些选择.
顺便说一下......这是一个反模式.您几乎肯定不想仅仅为了在两个视图之间共享某些功能而调用HTTP请求的所有开销.正确的做法是重构一个单独的函数来完成共享工作.我无法重构你的特定例子,因为你所拥有的非常简单,甚至不值得两个观点.你到底想要建造什么?
编辑:注释询问玩具stdlib服务器中的多线程模式是否足以防止发生死锁.我要说"也许".是的,如果没有任何依赖关系使两个线程都没有进展,并且两个线程都有足够的进度来完成他们的网络任务,那么请求将正确完成.但是,确定两个线程是否会相互死锁是不可判定的(证明省略为钝)并且我不愿意确定stdlib服务器可以正确执行.
| 归档时间: |
|
| 查看次数: |
35307 次 |
| 最近记录: |