当前位置: 首页 > 面试题库 >

Flask返回响应后执行函数

濮宇定
2023-03-14
问题内容

Flask返回响应后,我需要执行一些代码。我认为为它设置像Celery这样的任务队列不够复杂。关键要求是Flask必须在运行此功能之前将响应返回给客户端。它不能等待函数执行。

对此存在一些现有问题,但是在将响应发送到客户端之后,似乎没有一个答案能解决运行任务的问题,它们仍然同步执行,然后返回响应。


问题答案:

长话短说,Flask没有提供任何特殊功能来完成此任务。对于简单的一次性任务,请考虑使用Python的多线程,如下所示。对于更复杂的配置,请使用任务队列,例如RQ或Celery。

为什么?
重要的是要了解Flask提供的功能以及为什么它们无法实现预期的目标。所有这些都在其他情况下很有用,并且很好阅读,但对后台任务没有帮助。

Flask的after_request处理者

Flask的after_request处理程序(如本模式中有关延迟的请求回调的详细说明)以及有关每个请求附加不同功能的代码段,会将请求传递给回调函数。预期的用例是修改请求,例如附加cookie。

因此,请求将等待这些处理程序完成执行,因为期望结果是请求本身将发生更改。

Flask的teardown_request处理者

这类似于after_request,但teardown_request不接收request对象。这样就意味着它不会等待请求,对吗?

这似乎是解决方案,因为对类似的堆栈溢出问题的回答暗示了这一点。而且由于Flask的文档说明拆解回调与实际请求无关,并且不接收请求上下文,因此你很有理由相信这一点。

不幸的是,teardown_request它仍然是同步的,它只是在Flask的请求处理的后期发生,而该请求不再可修改。Flask 在返回响应之前仍会等待拆卸功能完成,因为此清单包含Flask回调和错误。

Flask的流式响应
Flask可以通过将生成器传递到来流式传输响应Response(),这是对类似问题的堆栈溢出答案所暗示的。

使用流传输时,客户端确实会在请求结束之前开始接收响应。但是,请求仍然是同步运行的,因此处理请求的工作人员很忙,直到流完成为止。

这种用于流式传输的Flask模式包括一些有关using的文档stream_with_context(),这对于包括请求上下文是必不可少的。

那么解决方案是什么?
Flask不提供在后台运行功能的解决方案,因为这不是Flask的责任。

在大多数情况下,解决此问题的最佳方法是使用任务队列,例如RQ或Celery。它们为你管理配置,计划和分配工作人员等棘手的事情,这是此类问题最常见的答案,因为它是最正确的,并迫使你以考虑上下文的​​方式进行设置。正确地。

如果你需要在后台运行函数,并且不想设置队列来管理此函数,则可以使用Python的内置函数threadingmultiprocessing生成后台工作器。

你无法request从后台任务访问Flask的其他线程本机,也无法访问其他Flask的线程本机,因为该请求在该处不会处于活动状态。而是在创建数据时将所需的数据从视图传递到后台线程。

@app.route('/start_task')
def start_task():
    def do_work(value):
        # do something that takes a long time
        import time
        time.sleep(value)

    thread = Thread(target=do_work, kwargs={'value': request.args.get('value', 20)})
    thread.start()
    return 'started'


 类似资料:
  • 问题内容: 一旦Ajax通过PHP返回了HTML代码,我就试图加载一个javascript函数。这需要我在ajax响应中回显javascript。 换句话说,我试图在PHP Ajax响应中添加此代码(放置在脚本标签之间)。.希望它执行 从到目前为止的内容来看,浏览器已经完成了Javascript的读取,因此不会执行。有没有办法做到这一点.... ? 问题答案: 您必须像这样评估该代码 要么 如果您

  • 问题内容: 我有一个函数,可使用Pandas分析CSV文件并生成带有摘要信息的字典。我想从Flask视图返回结果作为响应。如何返回JSON响应? 问题答案: 将摘要数据传递给该函数,该函数返回JSON响应。 从Flask 0.11开始,你可以将任何JSON可序列化的类型(不仅是dict)传递为顶级对象。

  • 问题内容: 就像一个人在这里问到但他的解决方案是调用其他函数 …我想知道是否有可能拥有一个不调用a的函数第二个功能基于异步请求的响应,但仅当异步请求响应时。 可能是这样的: 不调用另一个函数,这有可能吗? 我要实现的目标是拥有一个可以用一些参数调用的函数,该函数将返回异步Web服务(如FB)的响应。 问题答案: 简而言之,没有。您不能让异步函数同步返回有意义的值,因为该值当时不存在(因为它是在后台

  • 问题内容: 我有一个函数,可使用Pandas分析CSV文件并生成带有摘要信息的字典。我想从Flask视图返回结果作为响应。如何返回JSON响应? 问题答案: 将摘要数据传递给该函数,该函数返回JSON响应。 从Flask 0.11开始,你可以将任何可序列化的类型(不仅是dict)传递为顶级对象。

  • 问题内容: 例如,此URL: 应该返回一个类型的响应。我有两个静态图片, 如果type为1,则应该返回,否则返回。在烧瓶中怎么做? 问题答案: 你使用类似 发送回或,具体取决于类型查询参数。有关更多信息,请参见函数和对象的文档。

  • 问题内容: 我已经按照以下Flask-RESTful文档定义了自定义响应格式。 我有以下资源类。 我希望函数返回类型,函数返回默认值。 我该怎么做呢?关于这一点,文档不是很清楚。 问题答案: 使用哪种表示方式取决于request,标头类型。 的请求通过使用你的函数来响应。 如果你需要API方法中的特定响应类型,则必须使用返回“预烘焙”响应对象: