Неглобальное промежуточное программное обеспечение в Django

В Django существует файл настроек, который определяет промежуточное программное обеспечение, которое будет выполнено по каждому запросу. Эта установка промежуточного программного обеспечения глобальна. Существует ли способ указать ряд промежуточного программного обеспечения на основе на представление? Я хочу иметь определенный ряд использования URL промежуточного программного обеспечения, отличающегося от глобального набора.

36
задан hekevintran 26 May 2010 в 21:30
поделиться

3 ответа

Вы хотите decorator_from_middleware .

from django.utils.decorators import decorator_from_middleware

@decorator_from_middleware(MyMiddleware)
def view_function(request):
    #blah blah

Это не относится к URL-адресам, но работает для каждого просмотра, поэтому вы можете точно контролировать его действие.

42
ответ дан 27 November 2019 в 05:58
поделиться

Используйте django.core.urlresolvers.resolve () против request.path в оболочке для промежуточного программного обеспечения, чтобы попытаться увидеть, находится ли представление в приложении, и пропустить обработку если так.

1
ответ дан 27 November 2019 в 05:58
поделиться

Вот решение, которое я недавно использовал для решения сценария, который вы представили в комментарии к ответу Неда ...

Предполагается, что:

A) это настраиваемое промежуточное ПО или то, которое вы можете расширить / обернуть с помощью ваш собственный промежуточный класс

B) ваша логика может ждать до process_view вместо process_request , потому что в process_view вы можете проверить view_func после разрешения. (Или вы можете настроить приведенный ниже код, чтобы использовать urlresolvers , как указано Игнасио).

# settings.py
EXCLUDE_FROM_MY_MIDDLEWARE = set('myapp.views.view_to_exclude', 
    'myapp.views.another_view_to_exclude')

# some_middleware.py

from django.conf import settings

def process_view(self, request, view_func, view_args, view_kwargs):
    # Get the view name as a string
    view_name = '.'.join((view_func.__module__, view_func.__name__))

    # If the view name is in our exclusion list, exit early
    exclusion_set = getattr(settings, 'EXCLUDE_FROM_MY_MIDDLEWARE', set())
    if view_name in exclusion_set:
        return None

    # ... middleware as normal ...
    #
    # Here you can also set a flag of some sort on the `request` object
    # if you need to conditionally handle `process_response` as well.

Возможно, есть способ еще больше обобщить этот шаблон, но он довольно хорошо выполнил мою задачу.

Отвечая на ваш более общий вопрос, я не думаю, что в настоящее время в библиотеках Django есть что-то, что могло бы помочь вам с этим. Было бы хорошей темой для списка рассылки django-users, если бы она еще не была там адресована.

5
ответ дан 27 November 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: