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

0 投票
1 回答
590 浏览
提问于 2025-04-17 19:25

我正在为我的网站整合一个下载计数器。我的目标是每次点击下载按钮并下载文件时,都能触发这个计数器。

<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()

我知道这个方法并不完美,但能解决问题。如果有更好的建议,我非常欢迎。

撰写回答