2017-02-17 9 views
1

슬랙 이벤트 API를 사용하여 나의 슬랙봇과 대화를 녹음하고 있습니다."반환"하지 않고 HttpResponse (상태 = 200) 보내기 - 보낼 곳?

Events API는 HTTP POST로 장고 서버에 메시지를 푸시합니다. Slack은 3 초 내에 HTTP 200 응답을 기대하며 그렇지 않으면 메시지를 다시 POST합니다.

이벤트를 저장/처리하고 싶지만 처리가 3 초 내에 완료되지 않을지 잘 모르겠습니다. HTTP Status 200을 Slack으로 보내고 프로세스를 계속 진행하기를 원하지만 어디로 보낼지 모르겠다.. 보통, 나는 return HttpResponse(status=200)이고 python은 대상/전송을 관리합니다.

어떻게 응답 URI를 식별합니까? HTTP Status 200 (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

urllib2를 사용하여 이와 같은 응답을 반환 할 수 없습니다. 일반적인 접근법은 [Celery] (http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html)와 같은 것을 사용하여'processEvent' 태스크를 비동기 적으로 실행하는 것입니다. – Alasdair

답변

3

프로세스의 이러한 종류의 아이디어는 긴 과정과 비동기 작업을 시작, 신속 (이 경우 여유 서버) 보낸 사람에게 응답을 반환하는 것입니다.

하지만이 processEvent()를 비동기 적으로 실행하는 방법은 무엇입니까? 당신은 많은 해결책을 가지고 있습니다. 새로운 스레드를 생성하고이 새로운 스레드 내에서 실행되도록 프로세스를 구성 할 수 있지만 Django로 작업 할 때 매우 일반적인 방법은 아닙니다.

비동기 작업 실행을 전문으로하는 파이썬 라이브러리를 살펴보십시오. 매우 일반적인 라이브러리는 celery입니다. 이 같은

마지막으로, 뷰가 될 일이 : -에 Reponse 객체를 반환하여

@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

당신은 응답을 항상했던 길을 돌아, 아무것도 보낼 수있는 유일한 방법이 필요하지 않습니다 장고. 이러한 종류의 소프트 실시간은 일반적으로 응답을 빨리 반환해야하거나 사용자 (이 경우 서비스)가 결과에 만족하지 않아 웹 사이트에서 자주 발생하는 문제입니다.

일반적으로 이러한 경우에는 데이터를 저장하여 어딘가에서 처리하고 즉시 클라이언트로 보내려고합니다. 기본적으로 비동기 처리을 원합니다. 새로운 스레드를 생성하고 수동으로 호출하여 호출을 즉시 되돌릴 수 있지만 수동으로 수행 할 수 있습니다. 그러나 버그가있을 수 있으며 이미 해결 된 문제입니다.

Celery을 입력하십시오.이 같은 비동기 작업을 위해 만들어졌습니다. 몇 가지 기능을 작성하여 셀러리에 첨부하고 셀러리로 백그라운드에서 호출하여 3 초 제한 시간 내에 쉽게 사용할 수있게하십시오.

물론 이것은 몇 가지 설정과 외부 소프트웨어가 필요하지만 장기적으로 볼 때 가치가 있습니다. 그러나 정말로 제약이 있고 가난한 사람의 해결책이 필요한 경우 들어오는 데이터를 데이터베이스의 일부 대기열에 신속하게 저장하고 매분마다 실행되는 cron 작업으로 처리 할 수 ​​있습니다.