Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算django网站上静态文件的下载次数?_Python_Django_Python 3.6_Middleware_Django Middleware - Fatal编程技术网

Python 如何计算django网站上静态文件的下载次数?

Python 如何计算django网站上静态文件的下载次数?,python,django,python-3.6,middleware,django-middleware,Python,Django,Python 3.6,Middleware,Django Middleware,我是django的初学者。 在我的网站上,我想创建一个库,允许下载我自己创建的可执行文件。我想计算一下每个文件的下载次数 我想使用一个中间件,因为我知道我能够制作一个中间件来计算和显示页面的浏览次数: def stats_middleware (get_response): def middleware (request): try : p = Stat.objects.get(url = request.path) p.v

我是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提供文件是个坏主意,而且效率很低。为了控制对文件等的访问,服务器创建了特殊的机制。Apache中的X-Sendfile和Ngnix中的X-Accel-Redirect。您只需要在视图中创建特殊响应头。在同一视图中,您可以计算下载次数

您可以在此处阅读更多内容:

并尝试使用此软件包:

示例代码:

从sendfile导入sendfile
def下载(请求):
#这里是下载的增量计数器
返回sendfile(请求、文件名)

您如何为django网站提供服务?通常是静态文件,因此django网站甚至从未收到对静态文件的请求。无论如何,以这种方式修改响应内容是一个糟糕的想法-响应的内容不一定是纯文本-它可以是HTML(这将是无效的)、XML(这将是无效的和不可用的-没有解析器会接受它)、JSON(idem),任何其他定义的文本格式(csv、yaml等)也将被呈现为不可用,或者任何二进制格式将被完全破坏。即使您的响应碰巧是一个纯文本文档,您仍然会破坏HTTP“content length”响应头…谢谢您的回答!我真的是django的初学者,我不完全理解服务器的概念。你能给我看一个使用x-sendfile的简单视图的例子吗。我如何判断我的主机是使用Apache还是Ngnix?谢谢你的回答,对不起我的英语。如果你运行Django的开发者版本,那么就没有Webserver在使用(Django服务于一切)。部署时,您需要知道将在哪种服务器类型上使用。有关更多信息,请阅读Django文档