Как обрабатывать все представления (views) в проекте одной функцией без дублирования кода?

Это мой первый вопрос, не судите строго. Я нуб) Есть представление (views) в Django проекте:

def home_view(request):
    if request.GET.get('inv'):
        response = render(request, 'main.html', {})
        response.set_cookie('inv', request.GET.get('inv'), max_age=31536000)
    else:
        response = render(request, 'main.html', {})
    return response

Которое, если в запросе есть аргумент inv, рендерит шаблон main.html и устанавливает cookies на год, иначе рендерит шаблон без установки cookies.

Но мне эту штучку нужно будет делать для всех въюх проекта. То-есть обращение к любому URL сайта с параметром inv должно обрабатываться. Декораторами городить? Может в urls.py есть какая-то фишечка, чтобы направлять все запросы сначала на эту view, а потом уже на целевые?

Разобрался. Есть возможность перехватывать все запросы в промежуточном слое.

settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'oplus.middleware.cookie_middleware',  # мой промежуточный слой
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

middleware.py

from django.http import HttpRequest, HttpResponse


def cookie_middleware(get_response):

    def middleware(request: HttpRequest):
        response: HttpResponse = get_response(request)
        if request.GET.get('inv'):
            response.set_cookie('inv', request.GET.get('inv'),
                                max_age=31536000)

        return response

    return middleware

Всё отлично работает. Теперь обработка идет в промежуточном слое.

Вернуться на верх