Код для запуска во всех представлениях в файле views.py
Что было бы лучшим способом поместить немного кода для всех представлений в views.py
файл?
Я пришел из PHP-фона и обычно помещаю его в бит конструктора / индекса, чтобы он всегда выполнял любую запрашиваемую страницу. Он должен быть специфичным для этого файла views.py, но я хочу проверить, есть ли у пользователя доступ к "этому приложению / модулю", и хотите избежать необходимости использовать декораторы для всех представлений, если это возможно?
2 ответа
TL;DR
Вы должны проверить о промежуточном программном обеспечении. Это позволяет выполнить некоторый код перед выполнением представления, рендеринг шаблона и другие вещи.
Несколько слов о промежуточном программном обеспечении
Вы можете представлять промежуточное ПО в своей голове следующим образом:
Как вы можете видеть, запрос (оранжевая стрелка) проходит через все промежуточные программы перед выполнением представления, а затем может попасть на все промежуточные программы после (если вы хотите что-то сделать до обработки шаблона, например).
Использование Django 1.10
Архитектура промежуточного программного обеспечения изменилась в Django 1.10 и теперь представлена простой функцией. Например, вот счетчик посещений для каждой страницы:
def simple_middleware(get_response):
# One-time configuration and initialization.
def middleware(request):
try:
p = Page.objects.get(url=request.path)
p.nb_visits += 1
p.save()
except Page.DoesNotExist:
Page(url=request.path).save()
response = get_response(request)
if p:
response.content += "This page has been seen {0} times.".format(p.nb_visits)
return response
return middleware
И вуаля.
Используя DjangoВот пример промежуточного программного обеспечения, которое обновляет счетчик для каждого посещения страницы (допустим, что модель страницы существует с двумя полями: url и nb_visits)
class StatsMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
try:
p = Page.objects.get(url=request.path)
p.nb_visits += 1
p.save()
except Page.DoesNotExist:
Page(url=request.path).save()
def process_response(self, request, response):
if response.status_code == 200:
p = Page.objects.get(url=request.path)
# Let's say we add our info after the html response (dirty, yeah I know)
response.content += u"This page has been seen {0} times.".format(p.nb_visits)
return response
Надеюсь, это поможет вам:)
Промежуточное программное обеспечение является решением, но имейте в виду порядок определения промежуточного программного обеспечения в settings.py.