mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #26452 -- Loaded middleware on server start rather than on first request.
This commit is contained in:
		| @@ -6,7 +6,6 @@ import logging | ||||
| import re | ||||
| import sys | ||||
| from io import BytesIO | ||||
| from threading import Lock | ||||
|  | ||||
| from django import http | ||||
| from django.conf import settings | ||||
| @@ -147,18 +146,13 @@ class WSGIRequest(http.HttpRequest): | ||||
|  | ||||
|  | ||||
| class WSGIHandler(base.BaseHandler): | ||||
|     initLock = Lock() | ||||
|     request_class = WSGIRequest | ||||
|  | ||||
|     def __call__(self, environ, start_response): | ||||
|         # Set up middleware if needed. We couldn't do this earlier, because | ||||
|         # settings weren't available. | ||||
|         if self._request_middleware is None: | ||||
|             with self.initLock: | ||||
|                 # Check that middleware is still uninitialized. | ||||
|                 if self._request_middleware is None: | ||||
|                     self.load_middleware() | ||||
|     def __init__(self, *args, **kwargs): | ||||
|         super(WSGIHandler, self).__init__(*args, **kwargs) | ||||
|         self.load_middleware() | ||||
|  | ||||
|     def __call__(self, environ, start_response): | ||||
|         set_script_prefix(get_script_name(environ)) | ||||
|         signals.request_started.send(sender=self.__class__, environ=environ) | ||||
|         try: | ||||
|   | ||||
| @@ -714,6 +714,9 @@ Miscellaneous | ||||
|   :class:`~django.contrib.postgres.fields.RangeField`, you should change the | ||||
|   ``base_field`` attribute. | ||||
|  | ||||
| * Middleware classes are now initialized when the server starts rather than | ||||
|   during the first request. | ||||
|  | ||||
| .. _deprecated-features-1.10: | ||||
|  | ||||
| Features deprecated in 1.10 | ||||
|   | ||||
| @@ -260,8 +260,12 @@ of caveats: | ||||
|   define ``__init__`` as requiring any arguments. | ||||
|  | ||||
| * Unlike the ``process_*`` methods which get called once per request, | ||||
|   ``__init__`` gets called only *once*, when the Web server responds to the | ||||
|   first request. | ||||
|   ``__init__`` gets called only *once*, when the Web server starts. | ||||
|  | ||||
| .. versionchanged:: 1.10 | ||||
|  | ||||
|     In older versions, ``__init__`` was not called until the Web server | ||||
|     responded to its first request. | ||||
|  | ||||
| Marking middleware as unused | ||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
|   | ||||
| @@ -20,19 +20,9 @@ class HandlerTests(SimpleTestCase): | ||||
|     def tearDown(self): | ||||
|         request_started.connect(close_old_connections) | ||||
|  | ||||
|     # Mangle settings so the handler will fail | ||||
|     @override_settings(MIDDLEWARE_CLASSES=42) | ||||
|     def test_lock_safety(self): | ||||
|         """ | ||||
|         Tests for bug #11193 (errors inside middleware shouldn't leave | ||||
|         the initLock locked). | ||||
|         """ | ||||
|         # Try running the handler, it will fail in load_middleware | ||||
|     def test_middleware_initialized(self): | ||||
|         handler = WSGIHandler() | ||||
|         self.assertEqual(handler.initLock.locked(), False) | ||||
|         with self.assertRaises(Exception): | ||||
|             handler(None, None) | ||||
|         self.assertEqual(handler.initLock.locked(), False) | ||||
|         self.assertIsNotNone(handler._request_middleware) | ||||
|  | ||||
|     def test_bad_path_info(self): | ||||
|         """Tests for bug #15672 ('request' referenced before assignment)""" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user