防止下载太大的文件

时间:2013-09-12 13:02:25

标签: python http

我有一个网站,人们可以填写新闻源的网址。然后我的服务器将下载该新闻源并进行解析。我怎样才能保护自己免受太大的新闻传播?

我的意思是太大了:下载花费太多时间,带宽或文件空间太大了。我可以设置接收MB的数量限制吗?或者限制下载时间?

1 个答案:

答案 0 :(得分:3)

我知道的每个http客户端库(至少在Python中)为您提供或者可以为您提供

>>> import requests
>>> r = requests.get('https://example.com/big-file', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>

现在您有可用的响应标头,可能存在Content-Length:

>>> r.headers.get("content-length")
'33236'

取决于你如何从流中读取:

>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

如果我想按最大时间和最大尺寸限制下载,我会这样做:

t0 = time.time()
total_size = 0
while True:
    if time.time() - t0 > time_limit:
        raise Exception("Too much time taken")
    if total_size > size_limit:
        raise Exception("Too large")
    data = r.raw.read(8192)
    if data == "":
        break  # end of file
    total_size += len(data)
    output_file.write(data)

当您过早退出HTTP连接时,Web服务器不会停止工作:)