misc: optimize use of middlewares
Middleware are useless for the API endpoints, so we only apply them to views of the admin site.
This commit is contained in:
parent
58b91ba0de
commit
3a8c844535
|
@ -44,7 +44,7 @@ def authenticate(func):
|
|||
def wrapper(request, *args, **kwargs):
|
||||
global AUTH_TOKEN, AUTH_TOKEN_TIME # pylint: disable=global-statement
|
||||
|
||||
if not request.user.is_authenticated:
|
||||
if not hasattr(request, 'user') or not request.user.is_authenticated:
|
||||
header = request.headers.get('X-Hub-Rdv-Auth-Token', '')
|
||||
if not header:
|
||||
logger.warning('authentication failed, missing header X-HUB-RDV-AUTH-TOKEN')
|
||||
|
|
|
@ -20,6 +20,15 @@ INSTALLED_APPS = [
|
|||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
]
|
||||
|
||||
SILENCED_SYSTEM_CHECKS = [
|
||||
'admin.E408',
|
||||
'admin.E409',
|
||||
'admin.E410',
|
||||
]
|
||||
|
||||
ADMIN_MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
|
|
|
@ -6,7 +6,7 @@ from django.conf import settings
|
|||
from django.urls import include, path, register_converter
|
||||
from django.utils.timezone import is_aware
|
||||
|
||||
from . import admin, views
|
||||
from . import admin, urls_utils, views
|
||||
|
||||
|
||||
class IsoDatetimeConverter:
|
||||
|
@ -28,7 +28,7 @@ register_converter(IsoDatetimeConverter, 'isodatetime')
|
|||
|
||||
urlpatterns = [
|
||||
path('', views.homepage),
|
||||
path('admin/', admin.site.urls),
|
||||
path('admin/', urls_utils.decorate_admin(admin.site.urls)),
|
||||
path('api/', include('ants_hub.api.urls')),
|
||||
path(
|
||||
'rdv/<slug:collectivite_slug>-<int:collectivite_pk>'
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
# ANTS-Hub - Copyright (C) Entr'ouvert
|
||||
|
||||
|
||||
import importlib
|
||||
|
||||
from django.conf import settings
|
||||
from django.urls.resolvers import URLPattern, URLResolver
|
||||
from django.utils.decorators import decorator_from_middleware
|
||||
|
||||
|
||||
class DecoratedURLPattern(URLPattern):
|
||||
def resolve(self, *args, **kwargs):
|
||||
result = super().resolve(*args, **kwargs)
|
||||
if result:
|
||||
result.func = self._decorate_with(result.func)
|
||||
return result
|
||||
|
||||
|
||||
class DecoratedURLResolver(URLResolver):
|
||||
def resolve(self, *args, **kwargs):
|
||||
result = super().resolve(*args, **kwargs)
|
||||
if result:
|
||||
result.func = self._decorate_with(result.func)
|
||||
return result
|
||||
|
||||
|
||||
def decorated_includes(func, includes, *args, **kwargs):
|
||||
urlconf_module, app_name, namespace = includes
|
||||
|
||||
for item in urlconf_module:
|
||||
if isinstance(item, URLResolver):
|
||||
item.__class__ = DecoratedURLResolver
|
||||
else:
|
||||
item.__class__ = DecoratedURLPattern
|
||||
item._decorate_with = func
|
||||
|
||||
return urlconf_module, app_name, namespace
|
||||
|
||||
|
||||
def decorate_admin(includes):
|
||||
decorators = []
|
||||
for middleware_path in reversed(settings.ADMIN_MIDDLEWARE):
|
||||
module_name, class_name = middleware_path.rsplit('.', 1)
|
||||
module = importlib.import_module(module_name)
|
||||
middleware_class = getattr(module, class_name)
|
||||
decorators.append(decorator_from_middleware(middleware_class))
|
||||
|
||||
def decorator(func):
|
||||
for deco in decorators:
|
||||
func = deco(func)
|
||||
return func
|
||||
|
||||
return decorated_includes(decorator, includes)
|
|
@ -1,3 +1,4 @@
|
|||
# ANTS-Hub - Copyright (C) Entr'ouvert
|
||||
|
||||
SECRET_KEY = 'abcd'
|
||||
MIDDLEWARE += ADMIN_MIDDLEWARE # pylint: disable=undefined-variable
|
||||
|
|
Loading…
Reference in New Issue