【问题标题】:How to check if remote file exits behind a proxy如何检查远程文件是否存在于代理后面
【发布时间】:2011-11-15 13:41:45
【问题描述】:

我编写连接到 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 我可以删除文件...

我认为问题与代理缓存有关,我认为我无法删除该缓存,但可能有一些方法可以告诉代理我需要重新检查文件是否存在......

还有其他解决此问题的建议吗?

【问题讨论】:

    标签: python proxy mechanize file-exists


    【解决方案1】:

    最简单的解决方案可能是添加一个(未使用的)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

    【讨论】:

    • 谢谢,您的解决方案就像一个魅力 :-) 我也会阅读您的链接。唯一的问题是我不明白为什么您的解决方案有效。我不明白你为什么分配“request = 0”(我删除了这一行,代码仍然有效)而且我不知道“?r=%d”参数的作用(似乎它让代理相信程序请求不同的文件,但没有真正向服务器请求不同的文件)
    • @aloctavodia:我的意思是同一个变量,但写了不同的名称。现已修复。
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多