2011-09-12 32 views
0

我正在編寫連接到Web服務器(我是他服務器的所有者)的應用程序發送用戶提供的信息,處理該信息並將結果發送迴應用程序。處理結果所需的時間取決於用戶請求(從幾秒到幾分鐘)。如何檢查遠程文件是否退出代理

我用一個無限循環來檢查文件是否存在(可能還有一個更聰明的辦法......可能是我估計的請求可能需要和避免使用和無限循環的最長時間)

代碼的重要組成部分,看起來像這樣

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() 

即我等待足夠的時間來確保文件被創建之前試圖讀取它,我確實得到的文件:-)

這似乎是如果機械化要求一個文件,每次不退出mechanize會再問我將得不到文件...

我使用Firefox複製了相同的行爲。我問一個不存在的文件,然後我創建該文件(記住我是服務器的所有者...)我無法獲取該文件。 並使用mechanize和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) 

額外的參數應該由Web應用程序被忽略。

HTTP HEAD可能是正確的方法,請參閱this question for a example

+0

謝謝,你的解決方案就像一個魅力:-)我也會讀你的鏈接。唯一的問題是我不明白你的解決方案爲什麼起作用。我不明白你爲什麼要分配「請求= 0 」(我刪除了這一行,代碼仍然有效),我不知道「?r =%d」參數是幹什麼的(似乎它讓代理人相信該程序請求不同的文件,但沒有真正要求不同的文件到服務器) – aloctavodia

+0

@aloctavodia:我的意思是同一個變量,但寫了不同的名稱。現在修復。 –

相關問題