2009-07-24 3 views
0

traceroute와 같은 일부 시스템 명령의 출력에 의존하는 Pylons에 응용 프로그램을 작성 중입니다. 명령이 완료 될 때까지 기다렸다가 한 번에 모두 표시하기보다는 생성 된대로 명령 출력을 표시하고 싶습니다.Pylons를 사용하여 느린 스크립트의 업데이트 출력을 표시하려면 어떻게해야합니까?

How can I perform a ping or traceroute in python, accessing the output as it is produced?

지금 나는 그것이있는 그대로 브라우저에이 정보를 얻을 수있는 방법을 찾을 필요가 :

는이 질문에 대한 답변과 파이썬으로 명령의 출력에 액세스하는 방법을 발견 생성됩니다. jQuery의 loadContent()를 사용하여 스크립트의 출력을 로딩 할 계획이었다. 문제는 Pylons 컨트롤러가 return을 사용하므로 Pylons가 페이지를 렌더링하고 웹 서버가 클라이언트에 컨텐트로 응답하기 전에 출력이 완료되어야한다는 것입니다.

Pylons에서 생성 된 내용을 페이지에 표시 할 수있는 방법이 있습니까? 아니면 Pylons 외부에서 스크립팅을해야합니까?

기본적으로,이 같은 것을 할 노력하고있어 : http://network-tools.com/default.asp?prog=trace&host=www.bbc.co.uk

+0

수익 대신 수익률과 같은 것을 의미합니까? –

+0

yield를 사용하면 내용을 줄 단위로 생성 할 수 있지만 출력은 클라이언트에 보내기 전에 페이지가 완료 될 때까지 여전히 버퍼링됩니다. –

+2

WSGI 사양에서는 WSGI 응용 프로그램의 생성기에서 생성 된 각 문자열을 WSGI 어댑터에서 클라이언트로 플러시합니다. WSGI 어댑터가 버퍼링 할 수 없습니다. 따라서 WSGI 어댑터의 경우에는이 구문이 기술적으로 올바르지 않습니다. 따라서 WSGI 어댑터 바로 위에 WSGI 응용 프로그램을 통해 양보가 수행되면 즉시 클라이언트로 다시 보내야합니다. 고수준의 파이썬 프레임 워크가 그 동작을 유지하지 못한다면 WSGI 애플리케이션의 성격에 맞춰 작동하지 않습니다. –

답변

1

pexpect는 더 버퍼링, 오는대로 출력을 얻을 수있게된다.

정보를 사용자의 브라우저에서 즉시 업데이트하려면 브라우저에서 javascript를 사용하여 서버에 적절한 AJAX 요청을 보내야합니다 (dojo 또는 jquery가 엄격하게 요구하지는 않지만 쉽게 할 수 있음). 새 응답으로 페이지를 업데이트합니다. 클라이언트 측 협력없이 (JS + AJAX가 그 협력을 얻는 가장 간단한 방법 임) 서버 측에서만 할 수있는 합리적인 방법은 없습니다.

그래서 일반적인 접근 방식은 : 브라우저에서 AJAX 쿼리를 보내면 서버가 한 줄 더 빨리 응답하도록합니다. JS는 브라우저 업데이트 내용에 즉시 다른 쿼리를 보내고 서버가 "I 'm 모든 완료 "마커 (예 :"빈 "응답이 해당 목적으로 작동 할 수 있음).

+0

그래, 지금 내 마지막 질문에 대한 답변 덕분에 내용을 한 줄씩 얻을 수 있지만 여전히 브라우저별로 이것을 한 줄씩 가져와야합니다. jQuery를 사용하여 페이지의 내용을 업데이트 할 수 있지만 생성되는 동안 문제가 컨텐츠로 전달됩니다. –

+0

요점은 : 브라우저에서 AJAX 쿼리를 보내고 서버가 한 번 더 줄을 보내 자마자 브라우저 업데이트 내용에 JS가 즉시 다른 쿼리를 보내고 서버가 "I 'm all done"마커로 응답 할 때까지 반복합니다 (예 : 그 목적을 위해 "빈"응답이 작용할 수도 있음). –

0

필론으로 시도하지는 않았지만 느린 구성 요소의 출력을 페이지의 iframe (mime type text/plain 사용)에 표시하고 생성 된대로 각 청크를 iframe에 양보하도록 할 수 있습니다 . 재미있게하기 위해 나는 이것을 WHIFF 데모로 모았습니다. http://aaron.oirt.rutgers.edu/myapp/root/misc/slow :

import time 

def slow(env, start_response): 
    start_response("200 OK", [('Content-Type', 'text/plain')]) 
    return slow_generator() 

def slow_generator(): 
    yield "slowly generating 20 timestamps\n" 
    for i in range(20): 
     yield "%s: %s\n" % (i, time.ctime()) 
     time.sleep(1) 
    yield "done!" 

__wsgi__ = slow 

이 파일에서 내 노트북에 배포 다음은 천천히 생성 된 웹 콘텐츠 WSGI 응용 프로그램입니다.

{{env whiff.content_type: "text/html"/}} 

Here is an iframe with slowly generated content: 
<hr> 
<iframe frameborder="1" height="300px" width="300px" scrolling="yes" 
style="background-color:#99dddd;" 
src="slow" 
></iframe> 
<hr> 
Isn't that cool? 

이이 http://aaron.oirt.rutgers.edu/myapp/root/misc/showSlowly에서 내 노트북에 배포 : 여기

는 iframe에 느린 페이지를 포함하는 냄새 구성 템플릿입니다.

hmmm. 방금 Safari에서 위의 링크를 시도했는데 제대로 작동하지 않았습니다 ... 분명히 브라우저의 차이점이 있습니다 ... 적어도 Firefox에서 작동하는 것으로 보입니다 ...

1

이 항목은 faq 항목을 볼 수 있습니다 . 그런 다음 JS로 새로운 물건을 작성하기 전에 항상 화면을 지 웁니다.

관련 문제