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が、mechanizeが再度要求するたびに終了しないファイルを要求すると、ファイルが取得されないようです...

Firefoxを使用して同じ動作を複製しました。存在しないファイルを要求し、そのファイルを作成します(私がサーバーの所有者であることを忘れないでください...)ファイルを取得できません。そして、mechanizeとFirefoxを使用して、削除されたファイルを取得できます...

問題はプロキシキャッシュに関連していると思います。そのキャッシュを削除することはできないと思いますが、ファイルが存在するかどうかを再確認する必要があることをプロキシに伝える方法があるかもしれません...

この問題を解決するための他の提案はありますか?

4

1 に答える 1

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は、おそらくこれを行う正しい方法です。例については、この質問を参照してください。

于 2011-09-12T18:33:37.337 に答える