0

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

<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 存储的值?或者有没有更好的解决方案你可以建议。谢谢!

4

1 回答 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()

我知道它并不完美,但它可以完成工作。欢迎任何更好的建议。

于 2013-03-23T16:21:07.403 回答