我有一个网站,人们可以填写新闻源的网址。然后我的服务器将下载该新闻源并进行解析。我怎样才能保护自己免受太大的新闻传播?
我的意思是太大了:下载花费太多时间,带宽或文件空间太大了。我可以设置接收MB的数量限制吗?或者限制下载时间?
答案 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服务器不会停止工作:)