Django МастХэв. Выполнение функции после ответа

Блог / Фреймворк Django

Введение

Практически, на любом сайте есть весьма тяжелые медленные функции, которые никак не влияют на ответ пользователю. Это может быть логирование (сбор статистики посещений), информирование (отправка писем администраторам, сообщений в мессенжеры) и т.д. Если сайт написан на PHP, то посетителю придется ждать окончания всех действий и только потом он получит ответ на запрос, ведь для PHP отдача ответа пользователю равна окончанию работы скрипта. Работа Python-фреймворков (Django, в частности) весьма отличается от работы PHP, поэтому задачи и методы могут выполняться в любой желаемый момент.

В качестве примера возьмем стандартную ситуацию:

from models import Articles
from actions import saveStatistic

def get(request):
    articles = Articles.objects.all()
    saveStatistic(request)
    return render(request, ‘test.html’, {‘articles’: articles})

То есть, у нас есть функция, которая берет из базы значения и рендерит ответ пользователю. Перед отдачей пользователю ответа выполняется функция saveStatistic(), которая является тяжелой. Основываясь на данных request она проверяет наличие записей о данном посетителе в многомиллионной базе и, в зависимости от найденного, проводит определенные записи.

Что делать в данном случае? Если все оставить так, как есть, то пользователь будет долго дожидаться ответа от сервера, а это не есть хорошо. Для этого написана специальная библиотека django-after-response.

Установка django-after-response

Для того, чтобы внедрить django-after-response в свой проект, нужно его установить:

pip install django-after-response

и включить его в INSTALLED_APPS:

INSTALLED_APPS = (
    ...
    'after_response',
)

Использование django-after-response

Затем мы добавляем к нашему методу декоратор:

import after_response

@after_response.enabled
def saveStatistic(request):
    …

И вызовем наш метод иначе:

from models import Articles
from actions import saveStatistic

def get(request):
    articles = Articles.objects.all()
    saveStatistic.after_response(request)
    return render(request, ‘test.html’, {‘articles’: articles})

Это означает, что функция saveStatistic() не будет выполнена сейчас же, а отложится до полной отдачи ответа пользователю. Вот и все, вы можете подробнее узнать о данной библиотеке на GitHub.

Денис Каримов

Django МастХэв

Эта запись входит в ряд записей "Django МастХэв"

Комментарии
Написать комментарий

Написать комментарий

2017г. Karimov.info