【问题标题】:Executing a function after returning HTTP 200 OK in flask [duplicate]在烧瓶中返回HTTP 200 OK后执行函数[重复]
【发布时间】:2018-02-23 14:31:42
【问题描述】:

我正在开发一个 Flask 应用程序,它需要在 2 秒内返回 HTTP 200 OK。但是我的应用必须在发送 HTTP 200 OK 后启动一些工作。

@app.route('/events-slack', methods=['GET', 'POST'])
def events():
  if(rq.is_json):
      data = rq.get_json()
      if(data['token']==token):
          respond(data) #this function take more than 2 seconds
          r_data = {
            'OK' : True
          }
      else:
          r_data = {
            "error" : 'Token mismatch'
          }
  else:
      r_data = {
        "error" : 'Request was not JSON'
      }
  response = app.response_class(
      status=200,
      mimetype='application/json',
      response=json.dumps(r_data)
  )
  return response

问题是respond函数需要超过2秒来处理它收到的数据。我需要它先发送一个 HTTP 200 请求然后开始它的工作。

编辑

下面是respond函数的代码。

import requests
def respond(data):
    if data['type'] == "event_callback":
        event = data['event']
        if event['type'] == 'message':
            r_data = requests.post('URL', data = {'key' : 'data')
    else:
        r_data = {
                "error" : 'Type not recognized'
        }
    return r_data

【问题讨论】:

  • 我什么都听不懂。 2秒是什么?为什么是 2 秒?
  • 好吧,如果问题是响应(数据)需要超过 2 秒,我看不出这段代码将如何帮助我们检查问题。您应该向我们展示响应的代码。
  • 您可以在 retutn 响应之前打开一个异步任务。更多信息:docs.python.org/3/library/asyncio-task.html
  • @Nabin 我正在使用 Slack 的事件 API,它需要在 2 秒内确认请求的响应,所有其他处理可以稍后完成。
  • @lapinkoira 我在问题中添加了响应函数的代码。

标签: python python-3.x flask


【解决方案1】:

您需要将繁重的工作转移到后台,这样您就不必等待响应。这通常使用像 Celery 这样的任务队列来完成。

http://www.celeryproject.org

你也可以考虑一些轻量级的替代品,比如 Huey。

https://github.com/coleifer/huey/blob/master/README.rst

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 2016-12-12
    • 2013-05-20
    • 2015-01-07
    • 2018-09-11
    • 2011-12-11
    • 1970-01-01
    • 2021-04-23
    • 2018-04-28
    相关资源
    最近更新 更多