如何统计Django中文件下载功能函数的成功调用次数并在站点展示
实现方案
1. 新增下载统计模型
先在你对应App的models.py中添加统计用的表结构,用来存储总下载次数:
from django.db import models class DownloadStat(models.Model): total_download = models.IntegerField(default=0, verbose_name="总下载次数") last_update = models.DateTimeField(auto_now=True, verbose_name="最近下载时间") class Meta: verbose_name = "下载统计" verbose_name_plural = verbose_name
添加完成后执行迁移命令生成数据表:
python manage.py makemigrations python manage.py migrate
你可以进Django后台手动添加一条初始记录,把total_download设为0,后面会自动累加。
2. 修改视图函数添加计数逻辑
在你的下载视图中,表单验证通过、即将返回下载响应的位置添加计数逻辑,这里用Django的F表达式来避免并发请求下计数不准的问题:
from django.db.models import F from .models import DownloadStat def Only(request): page_title = 'Title' # 预先查询当前下载次数,用于模板展示 stat_obj = DownloadStat.objects.first() # 兼容初始无记录的场景,自动创建初始记录 if not stat_obj: stat_obj = DownloadStat.objects.create(total_download=0) download_count = stat_obj.total_download if request.method == "POST": form = Form(request.POST, request.FILES) if form.is_valid(): newdoc = request.FILES['file'] # 原有业务逻辑保持不变 # 下载计数+1 DownloadStat.objects.update(total_download=F('total_download') + 1) response = HttpResponse( output, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response['Content-Disposition'] = 'attachment; filename=%s' % filename return response else: form = Form() # 把下载次数传给模板 return render(request, 'only.html', { 'form': form, 'page_title':page_title, 'download_count': download_count })
3. 模板中展示统计结果
在你需要展示下载次数的模板位置(比如only.html的任意位置),直接渲染传过来的变量即可:
<p>当前文件累计下载次数:{{ download_count }}</p>
如果你后续需要更细粒度的统计,比如区分不同文件、不同用户的下载记录,只需要调整DownloadStat模型,新增文件名、用户ID、请求IP等字段,每次下载新增一条记录,统计时调用count()方法即可。
内容的提问来源于stack exchange,提问作者pergunt0
相关产品推荐
相关产品推荐

