mirror of
https://github.com/django/django.git
synced 2024-12-23 01:25:58 +00:00
Fixed #26452 -- Loaded middleware on server start rather than on first request.
This commit is contained in:
parent
23aa700b78
commit
99bb7fcc18
@ -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)"""
|
||||
|
Loading…
Reference in New Issue
Block a user