Как обрабатывать все представления (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
Всё отлично работает. Теперь обработка идет в промежуточном слое.