2011-09-12 13 views
0

ウェブサーバーに接続する書き込みアプリケーション(私はそのサーバーの所有者です)は、ユーザーから提供された情報を送信し、その情報を処理して結果をアプリケーションに返します。結果を処理するのに必要な時間は、ユーザーの要求(数秒から数分)に依存します。 リモートファイルがプロキシの背後にあるかどうかを確認する方法

は、私は、ファイルが存在するかどうかを確認するために無限ループを使用

(よりインテリジェントなアプローチがあるかもしれ...私は要求が取ると使用して、無限ループを避けることができ、最大時間を推定できたかもしれません)コードの重要な部分は、ループが終了したことがないプロキシの背後に、この

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を使用して同じ動作を複製しました。私は存在しないファイルを要求し、そのファイルを作成します(私はサーバーの所有者であることを忘れないでください)。ファイルを取得できません。 機械化と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ヘッダーがおそらくこれを行う正しい方法です。this question for a exampleを参照してください。

+0

ありがとうございます、あなたのソリューションは魅力のように動作します:-)あなたのリンクも読んでいます。唯一の問題は、あなたのソリューションがなぜ機能するのか分かりません。なぜあなたは "request = 0 "(私はこの行を削除し、コードはまだ動作します)を割り当てていますが、 "?r =%d"パラメータが何をしているのか分かりません(プロキシを信じさせるようですプログラムは異なるファイルを要求しますが、サーバーに別のファイルを実際に要求することはありません) – aloctavodia

+0

@aloctavodia:私は同じ変数を意味しましたが、別の名前を書いていました。今修正されました。 –

関連する問題