下载计数器:CGI FieldStorage重置按钮值
我正在为我的网站整合一个下载计数器。我的目标是每次点击下载按钮并下载文件时,都能触发这个计数器。
<form action="download.py" method="post">
<input type="submit" value="Download" name="DL" onClick="download_file()"/>
</form>
当点击这个按钮时,会下载一个文件,但我也想同时触发下载计数器:
import cgi
form = cgi.FieldStorage()
def count():
c.execute("INSERT INTO dl VALUES ('%d', '%s', '%s', '%s')" % (index, dt, ip, client))
conn.commit()
conn.close()
if "DL" in form:
count()
form.list = []
理论上,这样做是可行的,但问题是,cgi.FieldStorage在页面重新加载时不会重置,每次重新加载都会触发数据库,记录一个新的下载,这其实并没有发生。
我该如何完全重置或删除FieldStorage存储的值呢?或者你有什么更好的建议吗?谢谢!
1 个回答
0
我给想要解决这个问题的人留个方案。我通过检查最后一个下载文件的人的IP地址来解决这个问题。如果这个IP地址和再次下载的人相同(比如重复下载或者刷新页面),那么计数器就不会被触发。下面是相关的代码:
获取当前的IP:
ip = (getenv("HTTP_CLIENT_IP") or
getenv("HTTP_X_FORWARDED_FOR") or
getenv("REMOTE_ADDR") or
"UNKNOWN")
获取最后一个下载文件的IP:
last_ip_raw = c.execute('SELECT ip FROM dl ORDER BY id DESC LIMIT 1')
last_ip_tup = c.fetchone()
last_ip = str("%s" % last_ip_tup)
检查是否已经下载过:
def count():
if last_ip != ip:
c.execute("INSERT INTO dl VALUES ('%d', '%s', '%s', '%s')" % (index, dt, ip, client))
conn.commit()
conn.close()
我知道这个方法并不完美,但能解决问题。如果有更好的建议,我非常欢迎。