python - 在 flask 请求中发送 flask 请求

标签 python web-services python-2.7 flask webserver

我正在我的 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!

有两个我认为不令人满意的候选解决方案:

  1. 不要发出完整的请求。相反,只需调用映射到感兴趣的端点 (url_for) 的函数。我对这种方法不满意,因为嵌套请求有自己的 header 和 cookie,这种方法忽略了这些。此外,不会自动调用“before_request”和“after_request”处理程序中的代码

  2. 运行应用程序的多个实例。这将解决问题,但会将我的服务暴露给非常简单的 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/

相关文章:

python - 尝试掌握递归函数

python - xrange 与 itertools.count Python 2.7

python - 使用anytree模块在python中创建动态树

python - 使用 Maya 场景保存 Python 变量

xml - 动态解析 SOAP Web 服务

java - 使用 Jena 和 AXIS 的 Web 服务上的 InvocationTargetException

python - opencv错误文件无法打开读取cv::face::FaceRecognizer::read windows

python - 如何检查列表中每一项的 'if condition'

c# - WCF WebService 中的 GZip 压缩

python - 使用 Beautifulsoup 4 和 Python 2.7 解析 Web 表单