Как я могу подсчитать количество загрузок статических файлов на моем сайте django?

Я новичок в 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

Я думал, что если мне удастся открыть загрузку на новой странице, я смогу подсчитать, сколько раз она появляется и, следовательно, количество загрузок файла, но мне не удалось открыть загрузку в другой вкладке.

Как я могу это сделать?


person Robin Joseph    schedule 02.09.2019    source источник
comment
Как вы обслуживаете свой сайт django? Обычно статические файлы обслуживаются с использованием таких серверов, как Apache или Nginx в рабочей среде. , поэтому веб-сайт django даже не получает запросы на статические файлы.   -  person matevzpoljanc    schedule 02.09.2019
comment
Изменение содержимого ответа таким образом в любом случае является ужасной идеей - содержимое ответа не обязательно является простым текстом - это может быть HTML (который тогда будет недействительным), XML (который тогда будет недействительным И непригодным для использования - ни один синтаксический анализатор не примет его), JSON (idem), любой другой определенный текстовый формат (csv, yaml и т. д.), который также будет отображаться непригодным для использования, или любой двоичный формат, который затем будет полностью нарушен. И даже если ваш ответ оказался простым текстовым документом, вы все равно нарушили бы заголовок ответа HTTP с длиной содержимого...   -  person bruno desthuilliers    schedule 02.09.2019


Ответы (1)


Вам не нужно использовать промежуточное ПО. Обслуживание файлов через django — плохая идея и очень неэффективно. Для контроля доступа к файлам и так далее на серверах создается специальный механизм. X-Sendfile в Apache и X-Accel-Redirect в Ngnix. Вам нужно только создать специальный заголовок ответа в своем представлении. В том же представлении вы можете подсчитывать загрузки.

Вы можете прочитать больше здесь: 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)

person Grzegorz Bokota    schedule 02.09.2019
comment
Спасибо, что ответили мне! Я действительно новичок в django и не совсем понимаю концепцию серверов. Можете ли вы показать мне пример простого представления с использованием x-sendfile. И как я могу сказать, использует ли мой хост Apache или Ngnix? Спасибо за ваш ответ, и извините за мой английский. - person Robin Joseph; 03.09.2019
comment
Если вы запускаете версию Django для разработчиков, то веб-сервер не используется (Django обслуживает все). При развертывании вам необходимо знать, какой тип сервера вы будете использовать. Для получения дополнительной информации прочитайте документы Django docs.djangoproject.com/en/2.2/howto/deployment. - person Grzegorz Bokota; 03.09.2019