Код для запуска во всех представлениях в файле 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.

Другие вопросы по тегам