Вот решение, которое я недавно использовал для решения сценария, который вы представили в комментарии к ответу Неда ...
Предполагается, что:
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, если он еще не был там рассмотрен.