在烧瓶请求中发送烧瓶请求

吉尔绍

我正在Flask应用程序中实现一个端点,该端点接收HTTP请求的集合,并返回相应HTTP响应的集合。为了做到这一点,我需要我的端点调用其他端点以构造结果。但是,由于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)。我对这种方法不满意,因为嵌套的请求具有自己的标头和cookie,而这种方法忽略了它们。此外,“ before_request”和“ after_request”处理程序中的代码不会自动调用

  2. 运行该应用程序的多个实例。这将解决问题,但会使我的服务遭受非常简单的DoS攻击。如果我有X个实例在运行,那么攻击者所需要做的就是用X个不同的请求击中我的服务,从而导致死锁。

谢谢。

保罗·卡西洛

发生这种情况是因为您正在使用flask devserver。不是用于生产。在生产环境中,您将使用带有或不带有Web服务器层(NGINX,Apache等)的应用程序服务器(uWSGI,GUnicorn,Tornado等)来代理/平衡与受保护的工人的连接(不是完全,而是在一个可以接受来自DoS攻击的很多环境)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在烧瓶请求中发送烧瓶请求

来自分类Dev

烧瓶表格未发送发布请求

来自分类Dev

ajax json向烧瓶发送请求

来自分类Dev

获取烧瓶数据请求

来自分类Dev

烧瓶请求永远挂起

来自分类Dev

烧瓶404的POST请求

来自分类Dev

烧瓶形式。错误的请求

来自分类Dev

向自己发送发布请求时,烧瓶挂起

来自分类Dev

提交按钮混乱并两次发送请求(使用烧瓶)

来自分类Dev

获取烧瓶请求的引荐网址

来自分类Dev

烧瓶,无法分配请求的地址

来自分类Dev

烧瓶检查请求来自哪里

来自分类Dev

烧瓶错误请求错误 400

来自分类Dev

POST 请求在烧瓶上失败

来自分类Dev

重定向后烧瓶请求为空

来自分类Dev

烧瓶-无法正确响应GET请求?

来自分类Dev

上传文件时,请求错误(400),烧瓶

来自分类Dev

从 python 到烧瓶的传入请求错误

来自分类Dev

如何在基于烧瓶的本地网站上发送GET / POST请求?

来自分类Dev

在请求发送之前发生了烧瓶teardown_request

来自分类Dev

如何向安装在 EC2 上的烧瓶发送 http 请求

来自分类Dev

我无法将发布请求从反应表单发送到烧瓶服务器

来自分类Dev

$ .ajax请求后烧瓶上的错误请求(400)

来自分类Dev

在Facebook中发送朋友请求

来自分类Dev

在Watin中发送POST请求

来自分类Dev

在Scrapy中发送发帖请求

来自分类Dev

在JSONP请求中发送HTML

来自分类Dev

在Scala中发送HTTP请求

来自分类Dev

在Facebook中发送朋友请求