我正在我的 Flask 应用程序中实现一个端点,它接收一组 HTTP 请求,并返回一组相应的 HTTP 响应。为了实现这一点,我需要我的端点调用其他端点以构建结果。但是,由于 Flask 在处理原始请求时处于阻塞状态,因此无法处理嵌套请求,导致应用程序陷入死锁。
有没有什么方法可以在不导致死锁的情况下在 Flask 的请求中发出请求?
我包含了我的一段代码,我相信这应该足以说明问题而不会让你不知所措。如果您想查看更多内容,请告诉我,我会与您分享。
from requests import Session, Request
def split(request):
multipart = request.stream.read()
boundary = request.content_type.split(';')[1]
prefix = ' boundary"'
suffix = '"'
delimiter = '--%s' % boundary[len(prefix)+1:-len(suffix)]
subrequests = [s.lstrip() for s in multipart.split(delimiter)]
for sub in subrequests:
status_line, _, more_lines = sub.partition('\n')
method, path, version = status_line.split()
headers, _, body = more_lines.partition('\n\n')
url = 'http://localhost:3000' + path
return Request(method, url, headers=headers, data=body)
@app.route('/batch', methods=["GET", "POST"])
def batch():
subrequests = split(request)
session = Session()
responses = []
for sub in subrequests:
response.append(s.send(sub.prepare())) # Deadlock!
有两个我认为不令人满意的候选解决方案:
不要发出完整的请求。相反,只需调用映射到感兴趣的端点 (url_for) 的函数。我对这种方法不满意,因为嵌套请求有自己的 header 和 cookie,这种方法忽略了这些。此外,不会自动调用“before_request”和“after_request”处理程序中的代码
运行应用程序的多个实例。这将解决问题,但会将我的服务暴露给非常简单的 DoS 攻击。如果我有 X 个实例在运行,攻击者需要做的就是用 X 个不同的请求攻击我的服务,从而导致死锁。
谢谢。
最佳答案
知道内部 flask server 不是生产就绪的,当仅用于开发时,将 threaded=true 参数传递给 app.run。
app.run(debug=True, threaded=True)
关于python - 在 flask 请求中发送 flask 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24011629/