2011-09-12 2 views
0

웹 서버에 연결하는 필기 도구 (사용자의 서버 소유자)는 사용자가 제공 한 정보를 보내고 해당 정보를 처리 한 다음 결과를 다시 응용 프로그램에 보냅니다. 결과를 처리하는 데 필요한 시간은 사용자 요청 (몇 초에서 몇 분)에 따라 다릅니다. 원격 파일이 프록시를 통해 종료되는지 확인하는 방법

난 파일이 존재하는지 확인하는 무한 루프를 사용

(a보다 지능 접근가 될 수있다 ... I는 요청이 받아 사용하고 무한 루프를 방지 할 수있는 최대 시간을 예상 할 수있다) 코드의 중요한 부분은 루프가 끝나지 않아 프록시 뒤에이

import time 
import mechanize 

br = mechanize.Browser() 
br.set_handle_refresh(False) 
proxy_values={'http':'proxy:1234'} 
br.set_proxies(proxy_values) 


While True: 
    try: 
     result=br.open('http://www.example.com/sample.txt').read() 
     break 
    except: 
     pass 
time.sleep(10) 

처럼 보이는,하지만 난 이런 일에 대한 코드를 변경하는 경우

time.sleep(200) 
result=br.open('http://www.example.com/sample.txt').read() 

즉, 파일을 읽으려고하기 전에 파일을 만들 수 있도록 충분한 시간을 기다린다. 실제로 파일을 얻는다 :-)

기계화가 매번 종료하지 않는 파일을 요청하는 것처럼 보인다. 파일을 얻을 것이다 ...

나는 Firefox를 사용하여 동일한 행동을 복제했다. 존재하지 않는 파일을 요청한 다음 해당 파일을 만듭니다 (서버의 소유자임을 기억하십시오). 파일을 가져올 수 없습니다. 그리고 기계어와 파이어 폭스를 사용하면 삭제 된 파일을 얻을 수 있습니다 ...

문제는 프록시 캐시와 관련이 있다고 생각합니다. 캐시를 삭제할 수는 없지만 프록시에게 말할 수있는 방법이 있습니다. 파일이 존재하는지 다시 확인해야합니다 ...

이 문제를 해결하기위한 다른 제안 사항이 있습니까?

답변

2

가장 간단한 해결책은 요청을 캐싱하지 않도록 (사용하지 않은) GET 매개 변수를 추가하는 것입니다.

예 :

i = 0 
While True: 
    try: 
     result=br.open('http://www.example.com/sample.txt?r=%d' % i).read() 
     break 
    except: 
     i += 1 
    time.sleep(10) 

여분의 매개 변수가 웹 응용 프로그램에서 무시해야합니다.

아마도 HTTP HEAD가 올바른 방법 일 수 있습니다. this question for a example을 참조하십시오.

+0

감사합니다. 귀하의 솔루션은 매력처럼 작동합니다 :-) 나는 또한 귀하의 링크를 읽습니다. 유일한 문제는 솔루션이 왜 효과가 있는지 이해할 수 없다는 것입니다. 나는 왜 당신이 "request = 0 "(나는이 줄을 삭제하고 코드는 여전히 작동한다)을 할당하지 못했고 "? r = % d"매개 변수가 무엇인지 모르겠다. (프록시가 믿을 만하다. 프로그램은 다른 파일을 요구하지만 실제로 서버에 다른 파일을 요구하지 않고) – aloctavodia

+0

@aloctavodia : 나는 같은 변수를 의미했지만 다른 이름을 썼다. 이제 해결되었습니다. –