2009-09-03 2 views
6

잠재적으로 많은 시간이 걸릴 수있는 장고보기에 AJAX 요청을 보냅니다. 그러나 잘 정의 된 단계를 거치므로 사용자에게 상태 표시기를 인쇄하여 특정 일을 마치고 다음 단계로 넘어 갔다는 것을 알려주고 싶습니다.장고 - 응답을 플러시합니까?

do_something(); 
print 'Done doing something!'; 
flush(); 

do_something_else(); 
print 'Done doing something else!'; 
flush(); 

가 어떻게 장고와 같은 일을 가겠어요 :

나는 flush 기능을 사용하여, 그것은 다음과 같을 수 PHP를 사용하는 경우? the documentation을 보면 HttpResponse 객체에는 flush 메소드가 있지만이 메소드는 HttpResponse 인스턴스를 파일과 유사한 객체로 만듭니다. - 그게 내가 원하는 건지 모르겠다. 나는 응답을 반환해야하고 실제로 콘텐츠가 브라우저로 이동하는 시점을 제어 할 수 없기 때문에 Django에서이 작업을 수행하는 방법에 대해 머리를 감싸는 데 어려움을 겪고 있습니다.

답변

8

대부분의 웹 서버 (예 : FCGI/SCGI)는 자체 버퍼링을 수행하고 HTTP 클라이언트는 자체적으로 버퍼링을 수행합니다. 일반적인 작업이 아니기 때문에 실제로 이런 방식으로 데이터를 플러시하고 실제로 클라이언트가 데이터를 수신하는 것은 매우 어렵습니다.

당신이하려는 일에 가장 가까운 것은 반복자를 HttpResponse에 전달하고 생성기에서 작업하는 것입니다. 이 같은 :

def index(request): 
    def do_work(): 
     step_1() 
     yield "step 1 complete" 
     step_2() 
     yield "step 2 complete" 
     step_3() 
     yield "step 3 complete" 
    return HttpResponse(do_work()) 

...하지만하지 않습니다 반드시 플러시. (테스트 코드는 아니지만 아이디어를 얻을 수 있습니다 (http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators 참조)

인프라의 대부분은 단편적인 응답을 기대하지 않습니다. Django가 버퍼링을하지 않더라도 프론트 엔드 서버가 클라이언트 일 수도 있고 클라이언트가있을 수도 있습니다. 그래서 대부분의 것들이 이것을 위해 풀 업데이트를 사용합니다 : 장기 실행 요청의 상태를 쿼리하기위한 별도의 인터페이스.

(나도 이런 종류의에 대한 신뢰할 수있는 푸시 업데이트를 할 수 있도록하고 싶습니다 ...)

+0

감사합니다. 나는 발전기를 시도했지만 어리석게도 내 테스트에서 정수를 내고 있었고 작동하지 못하게했다. 나는 아마이 일을 전혀하지 않을 것이지만 최소한 언급 한 한계에도 불구하고 적어도 그것이 효과가 있었다는 것을 알면 좋다. –

4

난 당신이 플러시() 함수를 사용할 필요가 확실하지 않다.

AJAX 요청은 장고보기로 이동해야합니다.

단계를 세분화 할 수 있다면 간단하게 유지하고 각 단계마다보기를 만들 수 있습니다. 하나의 프로세스가 완료되면 AJAX를 통해 사용자를 업데이트하고 다음 요청을 시작할 수 있습니다.

views.py

def do_something(request): 
    # stuff here 
    return HttpResponse() 

def do_something_else(request): 
    # more stuff 
    return HttpResponse() 
+0

많은 경우에 이것은 원하지 않습니다. 전체 작업이 하나의 단위 인 경우 각 단계 시작 사이에 불필요한 지연이 추가됩니다 (클라이언트가 킥오프를 기다리는 중). 미세한 업데이트 (예 : 퍼센트 완료)를 원할 경우 더 나쁩니다. 전체 작업은 단일 데이터베이스 트랜잭션에서 실행되기를 원할 수 있습니다. 그렇지 않은 경우에도 전체 작업이 완료되지 않은 경우 정리하는 것이 좋습니다. 이는 클라이언트가 사라지면 중단하기위한 시간 제한이 필요하다는 의미입니다. 물론, 그것은 당신이하는 일에 달려 있습니다. –

+0

나는 구조와 결과에 대한 기대에 달려 있다고 동의한다. – monkut

+0

나는 그것을 위로 나누는 것을 고려했다, 그러나 위에 언급되는 이유 및 그 후에 나는 그것을 진짜로 피하기 위하여 희망하고 있었다. 모든 단계는 100 % 독립적이지만 도메인 당 2 개의 활성 요청 제한이 없습니까? –