我正在为我的网站集成一个下载计数器。我的目的是每次单击“下载”按钮并下载文件时触发计数器。 “下载”按钮位于:
<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存储的值?或者您可以提供更好的解决方案。谢谢!
答案 0 :(得分:0)
我将为googlers留下一个解决方案。我通过检查下载文件的人的最后一个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()
我知道这并不完美,但它确实起到了作用。任何更好的建议都会受到欢迎。