【问题标题】:How can I count the number of downloads of a static files on my django website?如何计算我的 django 网站上静态文件的下载次数?
【发布时间】:2019-09-02 08:18:37
【问题描述】:

我是 django 的初学者。
在我的网站上,我想创建一个库,允许下载我自己创建的可执行文件。我想计算每个文件被下载了多少次。

我想使用中间件,因为我知道我可以制作一个中间件来计算并显示页面被查看的次数:

def stats_middleware (get_response):
    def middleware (request):
        try :
            p = Stat.objects.get(url = request.path)
            p.views_number = F('views_number')+1
            p.save
        except Stat.DoesNotExist :
            p = Stat.objects.create(url= request.path)

        response = get_response(request)

        response.content += bytes(
            "cette page a été vue {} fois.".format(p.views_number),
            "utf8"
        )
        return response
    return middleware

我想如果我设法在新页面中打开下载,我可以计算它出现的次数,从而计算文件的下载次数,但我没有设法在另一个选项卡中打开下载。

我该怎么做?

【问题讨论】:

  • 您如何为您的 django 网站提供服务?通常静态文件是served using server like Apache or Nginx in production,所以django网站甚至从来没有得到静态文件的请求。
  • 以这种方式修改响应内容无论如何都是一个糟糕的主意 - 响应的内容不一定是纯文本 - 它可以是 HTML(然后将无效),XML(然后将无效且不可用- 没有解析器会接受它)、JSON(同上)、任何其他定义的文本格式(csv、yaml 等)也会变得不可用,或者任何二进制格式都会被完全破坏。即使您的响应碰巧是纯文本文档,您仍然会破坏 HTTP“内容长度”响应标头...

标签: python django python-3.6 middleware django-middleware


【解决方案1】:

您不需要使用中间件。通过 django 提供文件是个坏主意,而且效率很低。为了控制对文件等的访问,服务器创建了特殊的机制。 Apache 中的 X-Sendfile 和 Ngnix 中的 X-Accel-Redirect。您只需要在您的视图中创建特殊的响应标头。在同一视图中,您可以计算下载量。

你的车在这里阅读更多:Django - Understanding X-Sendfile

并尝试使用这个包:https://github.com/johnsensible/django-sendfile

示例代码:

from sendfile import sendfile

def download(request):
    # here increment counter of download 
    return sendfile(request, file_name)

【讨论】:

  • 感谢您的回答!我真的是 django 的初学者,我并不完全理解服务器的概念。你能给我看一个使用 x-sendfile 的简单视图的例子吗?我怎么能说我的主机是使用 Apache 还是 Ngnix 呢?谢谢你的回答,对不起我的英语。
  • 如果你运行 Django 的开发者版本,那么没有 webserwer 正在使用(Django 提供一切服务)。部署时,您需要知道将使用哪种服务器类型。有关更多信息,请阅读 Django 文档docs.djangoproject.com/en/2.2/howto/deployment
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2017-03-07
相关资源
最近更新 更多