发送 HttpResponse(status=200) 而不“返回” - 发送到哪里?

saw*_*yer 5 python django httpresponse slack-api

我正在使用 Slack Events API 来记录与我的 slackbot 的对话。

Events API 使用 HTTP POST 将消息推送到我的 Django 服务器。Slack 期望在 3 秒内收到 HTTP 200 响应,否则他们将重新 POST 消息。

我想存储/处理事件,但我不确定处理是否会在 3 秒内完成。我想将 HTTP Status 200 发送回 Slack,然后继续该过程,但我不知道将其发送到哪里。通常,我return HttpResponse(status=200)和 python 管理目的地/发送。

如何识别响应 URI?我可以发送HTTP Status 200urllib2

import json
import urllib2
from django.http import HttpResponse

def processEvent(event):
    # do some stuff that takes longer than 3 seconds
    return

def incomingEvent(request):
    event = json.loads(request.body)
    url = request.?????
    req = urllib2.Request(url, HttpResponse(200))
    processEvent(event)
Run Code Online (Sandbox Code Playgroud)

Ant*_*ane 6

这种流程的想法是用长流程启动异步任务,并快速将响应返回给发送者(在本例中为 Slack 服务器)。

但是如何异步执行这个processEvent()呢?你有很多解决方案。您可以创建一个新线程并将进程配置为在该新线程内运行,但这在使用 Django 时并不是一种非常常见的方法。

查看专门用于异步作业执行的 python 库。一个非常常见的库就是celery

最后,你的视图变成这样:

@app.task
def processEvent(event):
    # do some stuff that takes longer than 3 seconds
    return

def incomingEvent(request):
    event = json.loads(request.body)
    processEvent.delay(event)
    return HttpResponse()
Run Code Online (Sandbox Code Playgroud)