mirror of
https://github.com/django/django.git
synced 2025-08-04 02:48:35 +00:00
Refs #26601 -- Deprecated passing None as get_response arg to middleware classes.
This is the new contract since middleware refactoring in Django 1.10. Co-authored-by: Carlton Gibson <carlton.gibson@noumenal.es> Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
This commit is contained in:
parent
a34cb5a6d4
commit
4d973f5939
23 changed files with 668 additions and 502 deletions
105
tests/cache/tests.py
vendored
105
tests/cache/tests.py
vendored
|
@ -59,6 +59,10 @@ class Unpicklable:
|
|||
raise pickle.PickleError()
|
||||
|
||||
|
||||
def empty_response(request):
|
||||
return HttpResponse()
|
||||
|
||||
|
||||
KEY_ERRORS_WITH_MEMCACHED_MSG = (
|
||||
'Cache key contains characters that will cause errors if used with '
|
||||
'memcached: %r'
|
||||
|
@ -908,30 +912,31 @@ class BaseCacheTests:
|
|||
self.assertEqual(caches['custom_key2'].get('answer2'), 42)
|
||||
|
||||
def test_cache_write_unpicklable_object(self):
|
||||
update_middleware = UpdateCacheMiddleware()
|
||||
update_middleware.cache = cache
|
||||
|
||||
fetch_middleware = FetchFromCacheMiddleware()
|
||||
fetch_middleware = FetchFromCacheMiddleware(empty_response)
|
||||
fetch_middleware.cache = cache
|
||||
|
||||
request = self.factory.get('/cache/test')
|
||||
request._cache_update_cache = True
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
self.assertIsNone(get_cache_data)
|
||||
|
||||
response = HttpResponse()
|
||||
content = 'Testing cookie serialization.'
|
||||
response.content = content
|
||||
response.set_cookie('foo', 'bar')
|
||||
|
||||
update_middleware.process_response(request, response)
|
||||
def get_response(req):
|
||||
response = HttpResponse(content)
|
||||
response.set_cookie('foo', 'bar')
|
||||
return response
|
||||
|
||||
update_middleware = UpdateCacheMiddleware(get_response)
|
||||
update_middleware.cache = cache
|
||||
response = update_middleware(request)
|
||||
|
||||
get_cache_data = fetch_middleware.process_request(request)
|
||||
self.assertIsNotNone(get_cache_data)
|
||||
self.assertEqual(get_cache_data.content, content.encode())
|
||||
self.assertEqual(get_cache_data.cookies, response.cookies)
|
||||
|
||||
update_middleware.process_response(request, get_cache_data)
|
||||
UpdateCacheMiddleware(lambda req: get_cache_data)(request)
|
||||
get_cache_data = fetch_middleware.process_request(request)
|
||||
self.assertIsNotNone(get_cache_data)
|
||||
self.assertEqual(get_cache_data.content, content.encode())
|
||||
|
@ -1769,9 +1774,7 @@ class CacheHEADTest(SimpleTestCase):
|
|||
cache.clear()
|
||||
|
||||
def _set_cache(self, request, msg):
|
||||
response = HttpResponse()
|
||||
response.content = msg
|
||||
return UpdateCacheMiddleware().process_response(request, response)
|
||||
return UpdateCacheMiddleware(lambda req: HttpResponse(msg))(request)
|
||||
|
||||
def test_head_caches_correctly(self):
|
||||
test_content = 'test content'
|
||||
|
@ -1782,7 +1785,7 @@ class CacheHEADTest(SimpleTestCase):
|
|||
|
||||
request = self.factory.head(self.path)
|
||||
request._cache_update_cache = True
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
self.assertIsNotNone(get_cache_data)
|
||||
self.assertEqual(test_content.encode(), get_cache_data.content)
|
||||
|
||||
|
@ -1794,7 +1797,7 @@ class CacheHEADTest(SimpleTestCase):
|
|||
self._set_cache(request, test_content)
|
||||
|
||||
request = self.factory.head(self.path)
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
self.assertIsNotNone(get_cache_data)
|
||||
self.assertEqual(test_content.encode(), get_cache_data.content)
|
||||
|
||||
|
@ -1932,30 +1935,33 @@ class CacheI18nTest(SimpleTestCase):
|
|||
)
|
||||
def test_middleware(self):
|
||||
def set_cache(request, lang, msg):
|
||||
def get_response(req):
|
||||
return HttpResponse(msg)
|
||||
|
||||
translation.activate(lang)
|
||||
response = HttpResponse()
|
||||
response.content = msg
|
||||
return UpdateCacheMiddleware().process_response(request, response)
|
||||
return UpdateCacheMiddleware(get_response)(request)
|
||||
|
||||
# cache with non empty request.GET
|
||||
request = self.factory.get(self.path, {'foo': 'bar', 'other': 'true'})
|
||||
request._cache_update_cache = True
|
||||
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
# first access, cache must return None
|
||||
self.assertIsNone(get_cache_data)
|
||||
response = HttpResponse()
|
||||
content = 'Check for cache with QUERY_STRING'
|
||||
response.content = content
|
||||
UpdateCacheMiddleware().process_response(request, response)
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
|
||||
def get_response(req):
|
||||
return HttpResponse(content)
|
||||
|
||||
UpdateCacheMiddleware(get_response)(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
# cache must return content
|
||||
self.assertIsNotNone(get_cache_data)
|
||||
self.assertEqual(get_cache_data.content, content.encode())
|
||||
# different QUERY_STRING, cache must be empty
|
||||
request = self.factory.get(self.path, {'foo': 'bar', 'somethingelse': 'true'})
|
||||
request._cache_update_cache = True
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
self.assertIsNone(get_cache_data)
|
||||
|
||||
# i18n tests
|
||||
|
@ -1965,7 +1971,7 @@ class CacheI18nTest(SimpleTestCase):
|
|||
request = self.factory.get(self.path)
|
||||
request._cache_update_cache = True
|
||||
set_cache(request, 'en', en_message)
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
# The cache can be recovered
|
||||
self.assertIsNotNone(get_cache_data)
|
||||
self.assertEqual(get_cache_data.content, en_message.encode())
|
||||
|
@ -1976,11 +1982,11 @@ class CacheI18nTest(SimpleTestCase):
|
|||
# change again the language
|
||||
translation.activate('en')
|
||||
# retrieve the content from cache
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
self.assertEqual(get_cache_data.content, en_message.encode())
|
||||
# change again the language
|
||||
translation.activate('es')
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
self.assertEqual(get_cache_data.content, es_message.encode())
|
||||
# reset the language
|
||||
translation.deactivate()
|
||||
|
@ -1991,14 +1997,15 @@ class CacheI18nTest(SimpleTestCase):
|
|||
)
|
||||
def test_middleware_doesnt_cache_streaming_response(self):
|
||||
request = self.factory.get(self.path)
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
self.assertIsNone(get_cache_data)
|
||||
|
||||
content = ['Check for cache with streaming content.']
|
||||
response = StreamingHttpResponse(content)
|
||||
UpdateCacheMiddleware().process_response(request, response)
|
||||
def get_stream_response(req):
|
||||
return StreamingHttpResponse(['Check for cache with streaming content.'])
|
||||
|
||||
get_cache_data = FetchFromCacheMiddleware().process_request(request)
|
||||
UpdateCacheMiddleware(get_stream_response)(request)
|
||||
|
||||
get_cache_data = FetchFromCacheMiddleware(empty_response).process_request(request)
|
||||
self.assertIsNone(get_cache_data)
|
||||
|
||||
|
||||
|
@ -2055,17 +2062,18 @@ class CacheMiddlewareTest(SimpleTestCase):
|
|||
Middleware vs. usage of CacheMiddleware as view decorator and setting attributes
|
||||
appropriately.
|
||||
"""
|
||||
# If no arguments are passed in construction, it's being used as middleware.
|
||||
middleware = CacheMiddleware()
|
||||
# If only one argument is passed in construction, it's being used as
|
||||
# middleware.
|
||||
middleware = CacheMiddleware(empty_response)
|
||||
|
||||
# Now test object attributes against values defined in setUp above
|
||||
self.assertEqual(middleware.cache_timeout, 30)
|
||||
self.assertEqual(middleware.key_prefix, 'middlewareprefix')
|
||||
self.assertEqual(middleware.cache_alias, 'other')
|
||||
|
||||
# If arguments are being passed in construction, it's being used as a decorator.
|
||||
# First, test with "defaults":
|
||||
as_view_decorator = CacheMiddleware(cache_alias=None, key_prefix=None)
|
||||
# If more arguments are being passed in construction, it's being used
|
||||
# as a decorator. First, test with "defaults":
|
||||
as_view_decorator = CacheMiddleware(empty_response, cache_alias=None, key_prefix=None)
|
||||
|
||||
self.assertEqual(as_view_decorator.cache_timeout, 30) # Timeout value for 'default' cache, i.e. 30
|
||||
self.assertEqual(as_view_decorator.key_prefix, '')
|
||||
|
@ -2073,16 +2081,18 @@ class CacheMiddlewareTest(SimpleTestCase):
|
|||
self.assertEqual(as_view_decorator.cache_alias, 'default')
|
||||
|
||||
# Next, test with custom values:
|
||||
as_view_decorator_with_custom = CacheMiddleware(cache_timeout=60, cache_alias='other', key_prefix='foo')
|
||||
as_view_decorator_with_custom = CacheMiddleware(
|
||||
hello_world_view, cache_timeout=60, cache_alias='other', key_prefix='foo'
|
||||
)
|
||||
|
||||
self.assertEqual(as_view_decorator_with_custom.cache_timeout, 60)
|
||||
self.assertEqual(as_view_decorator_with_custom.key_prefix, 'foo')
|
||||
self.assertEqual(as_view_decorator_with_custom.cache_alias, 'other')
|
||||
|
||||
def test_middleware(self):
|
||||
middleware = CacheMiddleware()
|
||||
prefix_middleware = CacheMiddleware(key_prefix='prefix1')
|
||||
timeout_middleware = CacheMiddleware(cache_timeout=1)
|
||||
middleware = CacheMiddleware(hello_world_view)
|
||||
prefix_middleware = CacheMiddleware(hello_world_view, key_prefix='prefix1')
|
||||
timeout_middleware = CacheMiddleware(hello_world_view, cache_timeout=1)
|
||||
|
||||
request = self.factory.get('/view/')
|
||||
|
||||
|
@ -2223,18 +2233,13 @@ class CacheMiddlewareTest(SimpleTestCase):
|
|||
Django must prevent caching of responses that set a user-specific (and
|
||||
maybe security sensitive) cookie in response to a cookie-less request.
|
||||
"""
|
||||
csrf_middleware = CsrfViewMiddleware()
|
||||
cache_middleware = CacheMiddleware()
|
||||
|
||||
request = self.factory.get('/view/')
|
||||
self.assertIsNone(cache_middleware.process_request(request))
|
||||
|
||||
csrf_middleware = CsrfViewMiddleware(csrf_view)
|
||||
csrf_middleware.process_view(request, csrf_view, (), {})
|
||||
cache_middleware = CacheMiddleware(csrf_middleware)
|
||||
|
||||
response = csrf_view(request)
|
||||
|
||||
response = csrf_middleware.process_response(request, response)
|
||||
response = cache_middleware.process_response(request, response)
|
||||
self.assertIsNone(cache_middleware.process_request(request))
|
||||
cache_middleware(request)
|
||||
|
||||
# Inserting a CSRF cookie in a cookie-less request prevented caching.
|
||||
self.assertIsNone(cache_middleware.process_request(request))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue