В Django существует файл настроек, который определяет промежуточное программное обеспечение, которое будет выполнено по каждому запросу. Эта установка промежуточного программного обеспечения глобальна. Существует ли способ указать ряд промежуточного программного обеспечения на основе на представление? Я хочу иметь определенный ряд использования URL промежуточного программного обеспечения, отличающегося от глобального набора.
Вы хотите decorator_from_middleware
.
from django.utils.decorators import decorator_from_middleware
@decorator_from_middleware(MyMiddleware)
def view_function(request):
#blah blah
Это не относится к URL-адресам, но работает для каждого просмотра, поэтому вы можете точно контролировать его действие.
Используйте django.core.urlresolvers.resolve ()
против request.path
в оболочке для промежуточного программного обеспечения, чтобы попытаться увидеть, находится ли представление в приложении, и пропустить обработку если так.
Вот решение, которое я недавно использовал для решения сценария, который вы представили в комментарии к ответу Неда ...
Предполагается, что:
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, если бы она еще не была там адресована.