发送HttpResponse(状态= 200)而不“返回” - 发送到何处?

时间:2017-02-17 14:40:29

标签: python django httpresponse slack-api

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

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

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

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

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)

2 个答案:

答案 0 :(得分:3)

这种过程的想法是使用长进程启动异步任务,并快速返回对发送方的响应(在这种情况下为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()

答案 1 :(得分:1)

您不需要发送任何内容,这是通过在django中返回Reponse对象来按照您一直以来的方式返回响应的唯一方法。这种软实时是网站中的常见问题,因为通常需要快速返回响应,或者用户(在这种情况下是服务)对结果不满意。

通常在这种情况下,您希望将数据保存到某处并立即返回客户端。基本上,您需要异步处理。您可以通过创建新线程并对其进行后台处理来手动执行此操作,以便调用可以立即返回,但您可能会遇到错误,这是一个已经解决的问题。

输入Celery - 它是为这样的异步作业而制作的。编写一些函数,将它们附加到Celery,然后使用Celery在后台调用它们,这样您就可以轻松地适应3秒的时间限制。

当然这需要一些设置和外部软件,但从长远来看它是值得的。但是如果您真的受到约束并且需要一个穷人的解决方案,您可以快速将传入的数据保存到数据库中的某个队列中,并花费您的愉快时间来处理每分钟运行一次的cron作业。