下载计数器:cgi FieldStorage重置按下的按钮值

时间:2013-03-17 17:38:33

标签: python html cgi

我正在为我的网站集成一个下载计数器。我的目的是每次单击“下载”按钮并下载文件时触发计数器。 “下载”按钮位于:

<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 :(得分: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()

我知道这并不完美,但它确实起到了作用。任何更好的建议都会受到欢迎。