mirror of
https://github.com/django/django.git
synced 2025-06-03 02:29:13 +00:00
Refs #26601 -- Made get_response argument required and don't accept None in middleware classes.
Per deprecation timeline.
This commit is contained in:
parent
6b4941dd57
commit
4bb30fe5d5
@ -12,7 +12,7 @@ class RedirectFallbackMiddleware(MiddlewareMixin):
|
|||||||
response_gone_class = HttpResponseGone
|
response_gone_class = HttpResponseGone
|
||||||
response_redirect_class = HttpResponsePermanentRedirect
|
response_redirect_class = HttpResponsePermanentRedirect
|
||||||
|
|
||||||
def __init__(self, get_response=None):
|
def __init__(self, get_response):
|
||||||
if not apps.is_installed('django.contrib.sites'):
|
if not apps.is_installed('django.contrib.sites'):
|
||||||
raise ImproperlyConfigured(
|
raise ImproperlyConfigured(
|
||||||
"You cannot use RedirectFallbackMiddleware when "
|
"You cannot use RedirectFallbackMiddleware when "
|
||||||
|
@ -10,9 +10,7 @@ from django.utils.http import http_date
|
|||||||
|
|
||||||
|
|
||||||
class SessionMiddleware(MiddlewareMixin):
|
class SessionMiddleware(MiddlewareMixin):
|
||||||
# RemovedInDjango40Warning: when the deprecation ends, replace with:
|
def __init__(self, get_response):
|
||||||
# def __init__(self, get_response):
|
|
||||||
def __init__(self, get_response=None):
|
|
||||||
super().__init__(get_response)
|
super().__init__(get_response)
|
||||||
engine = import_module(settings.SESSION_ENGINE)
|
engine = import_module(settings.SESSION_ENGINE)
|
||||||
self.SessionStore = engine.SessionStore
|
self.SessionStore = engine.SessionStore
|
||||||
|
@ -61,9 +61,7 @@ class UpdateCacheMiddleware(MiddlewareMixin):
|
|||||||
UpdateCacheMiddleware must be the first piece of middleware in MIDDLEWARE
|
UpdateCacheMiddleware must be the first piece of middleware in MIDDLEWARE
|
||||||
so that it'll get called last during the response phase.
|
so that it'll get called last during the response phase.
|
||||||
"""
|
"""
|
||||||
# RemovedInDjango40Warning: when the deprecation ends, replace with:
|
def __init__(self, get_response):
|
||||||
# def __init__(self, get_response):
|
|
||||||
def __init__(self, get_response=None):
|
|
||||||
super().__init__(get_response)
|
super().__init__(get_response)
|
||||||
self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
|
self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
|
||||||
self.page_timeout = None
|
self.page_timeout = None
|
||||||
@ -124,9 +122,7 @@ class FetchFromCacheMiddleware(MiddlewareMixin):
|
|||||||
FetchFromCacheMiddleware must be the last piece of middleware in MIDDLEWARE
|
FetchFromCacheMiddleware must be the last piece of middleware in MIDDLEWARE
|
||||||
so that it'll get called last during the request phase.
|
so that it'll get called last during the request phase.
|
||||||
"""
|
"""
|
||||||
# RemovedInDjango40Warning: when the deprecation ends, replace with:
|
def __init__(self, get_response):
|
||||||
# def __init__(self, get_response):
|
|
||||||
def __init__(self, get_response=None):
|
|
||||||
super().__init__(get_response)
|
super().__init__(get_response)
|
||||||
self.key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
|
self.key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
|
||||||
self.cache_alias = settings.CACHE_MIDDLEWARE_ALIAS
|
self.cache_alias = settings.CACHE_MIDDLEWARE_ALIAS
|
||||||
@ -168,9 +164,7 @@ class CacheMiddleware(UpdateCacheMiddleware, FetchFromCacheMiddleware):
|
|||||||
Also used as the hook point for the cache decorator, which is generated
|
Also used as the hook point for the cache decorator, which is generated
|
||||||
using the decorator-from-middleware utility.
|
using the decorator-from-middleware utility.
|
||||||
"""
|
"""
|
||||||
# RemovedInDjango40Warning: when the deprecation ends, replace with:
|
def __init__(self, get_response, cache_timeout=None, page_timeout=None, **kwargs):
|
||||||
# def __init__(self, get_response, cache_timeout=None, page_timeout=None, **kwargs):
|
|
||||||
def __init__(self, get_response=None, cache_timeout=None, page_timeout=None, **kwargs):
|
|
||||||
super().__init__(get_response)
|
super().__init__(get_response)
|
||||||
# We need to differentiate between "provided, but using default value",
|
# We need to differentiate between "provided, but using default value",
|
||||||
# and "not provided". If the value is provided using a default, then
|
# and "not provided". If the value is provided using a default, then
|
||||||
|
@ -6,9 +6,7 @@ from django.utils.deprecation import MiddlewareMixin
|
|||||||
|
|
||||||
|
|
||||||
class SecurityMiddleware(MiddlewareMixin):
|
class SecurityMiddleware(MiddlewareMixin):
|
||||||
# RemovedInDjango40Warning: when the deprecation ends, replace with:
|
def __init__(self, get_response):
|
||||||
# def __init__(self, get_response):
|
|
||||||
def __init__(self, get_response=None):
|
|
||||||
super().__init__(get_response)
|
super().__init__(get_response)
|
||||||
self.sts_seconds = settings.SECURE_HSTS_SECONDS
|
self.sts_seconds = settings.SECURE_HSTS_SECONDS
|
||||||
self.sts_include_subdomains = settings.SECURE_HSTS_INCLUDE_SUBDOMAINS
|
self.sts_include_subdomains = settings.SECURE_HSTS_INCLUDE_SUBDOMAINS
|
||||||
|
@ -89,10 +89,9 @@ class MiddlewareMixin:
|
|||||||
sync_capable = True
|
sync_capable = True
|
||||||
async_capable = True
|
async_capable = True
|
||||||
|
|
||||||
# RemovedInDjango40Warning: when the deprecation ends, replace with:
|
def __init__(self, get_response):
|
||||||
# def __init__(self, get_response):
|
if get_response is None:
|
||||||
def __init__(self, get_response=None):
|
raise ValueError('get_response must be provided.')
|
||||||
self._get_response_none_deprecation(get_response)
|
|
||||||
self.get_response = get_response
|
self.get_response = get_response
|
||||||
self._async_check()
|
self._async_check()
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@ -137,11 +136,3 @@ class MiddlewareMixin:
|
|||||||
thread_sensitive=True,
|
thread_sensitive=True,
|
||||||
)(request, response)
|
)(request, response)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def _get_response_none_deprecation(self, get_response):
|
|
||||||
if get_response is None:
|
|
||||||
warnings.warn(
|
|
||||||
'Passing None for the middleware get_response argument is '
|
|
||||||
'deprecated.',
|
|
||||||
RemovedInDjango40Warning, stacklevel=3,
|
|
||||||
)
|
|
||||||
|
@ -295,3 +295,7 @@ to remove usage of these features.
|
|||||||
|
|
||||||
* Support for the pre-Django 3.1 user sessions (that use the SHA-1 algorithm)
|
* Support for the pre-Django 3.1 user sessions (that use the SHA-1 algorithm)
|
||||||
is removed.
|
is removed.
|
||||||
|
|
||||||
|
* The ``get_request`` argument for
|
||||||
|
``django.utils.deprecation.MiddlewareMixin.__init__()`` is required and
|
||||||
|
doesn't accept ``None``.
|
||||||
|
@ -28,14 +28,10 @@ from django.middleware.http import ConditionalGetMiddleware
|
|||||||
from django.middleware.locale import LocaleMiddleware
|
from django.middleware.locale import LocaleMiddleware
|
||||||
from django.middleware.security import SecurityMiddleware
|
from django.middleware.security import SecurityMiddleware
|
||||||
from django.test import SimpleTestCase
|
from django.test import SimpleTestCase
|
||||||
from django.utils.deprecation import MiddlewareMixin, RemovedInDjango40Warning
|
from django.utils.deprecation import MiddlewareMixin
|
||||||
|
|
||||||
|
|
||||||
class MiddlewareMixinTests(SimpleTestCase):
|
class MiddlewareMixinTests(SimpleTestCase):
|
||||||
"""
|
|
||||||
Deprecation warning is raised when using get_response=None.
|
|
||||||
"""
|
|
||||||
msg = 'Passing None for the middleware get_response argument is deprecated.'
|
|
||||||
middlewares = [
|
middlewares = [
|
||||||
AuthenticationMiddleware,
|
AuthenticationMiddleware,
|
||||||
BrokenLinkEmailsMiddleware,
|
BrokenLinkEmailsMiddleware,
|
||||||
@ -58,16 +54,11 @@ class MiddlewareMixinTests(SimpleTestCase):
|
|||||||
XViewMiddleware,
|
XViewMiddleware,
|
||||||
]
|
]
|
||||||
|
|
||||||
def test_deprecation(self):
|
|
||||||
for middleware in self.middlewares:
|
|
||||||
with self.subTest(middleware=middleware):
|
|
||||||
with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
|
|
||||||
middleware()
|
|
||||||
|
|
||||||
def test_passing_explicit_none(self):
|
def test_passing_explicit_none(self):
|
||||||
|
msg = 'get_response must be provided.'
|
||||||
for middleware in self.middlewares:
|
for middleware in self.middlewares:
|
||||||
with self.subTest(middleware=middleware):
|
with self.subTest(middleware=middleware):
|
||||||
with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
|
with self.assertRaisesMessage(ValueError, msg):
|
||||||
middleware(None)
|
middleware(None)
|
||||||
|
|
||||||
def test_coroutine(self):
|
def test_coroutine(self):
|
||||||
|
@ -3,7 +3,9 @@ from django.contrib.redirects.middleware import RedirectFallbackMiddleware
|
|||||||
from django.contrib.redirects.models import Redirect
|
from django.contrib.redirects.models import Redirect
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.http import HttpResponseForbidden, HttpResponseRedirect
|
from django.http import (
|
||||||
|
HttpResponse, HttpResponseForbidden, HttpResponseRedirect,
|
||||||
|
)
|
||||||
from django.test import TestCase, modify_settings, override_settings
|
from django.test import TestCase, modify_settings, override_settings
|
||||||
|
|
||||||
|
|
||||||
@ -58,12 +60,15 @@ class RedirectTests(TestCase):
|
|||||||
|
|
||||||
@modify_settings(INSTALLED_APPS={'remove': 'django.contrib.sites'})
|
@modify_settings(INSTALLED_APPS={'remove': 'django.contrib.sites'})
|
||||||
def test_sites_not_installed(self):
|
def test_sites_not_installed(self):
|
||||||
|
def get_response(request):
|
||||||
|
return HttpResponse()
|
||||||
|
|
||||||
msg = (
|
msg = (
|
||||||
'You cannot use RedirectFallbackMiddleware when '
|
'You cannot use RedirectFallbackMiddleware when '
|
||||||
'django.contrib.sites is not installed.'
|
'django.contrib.sites is not installed.'
|
||||||
)
|
)
|
||||||
with self.assertRaisesMessage(ImproperlyConfigured, msg):
|
with self.assertRaisesMessage(ImproperlyConfigured, msg):
|
||||||
RedirectFallbackMiddleware()
|
RedirectFallbackMiddleware(get_response)
|
||||||
|
|
||||||
|
|
||||||
class OverriddenRedirectFallbackMiddleware(RedirectFallbackMiddleware):
|
class OverriddenRedirectFallbackMiddleware(RedirectFallbackMiddleware):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user