mirror of https://github.com/zulip/zulip.git
Django 1.11: MIDDLEWARE_CLASSES setting is deprecated.
Django provides MiddlewareMixin to upgrade old-style middlewares. See https://docs.djangoproject.com/en/1.11/topics/http/middleware/#upgrading-middleware
This commit is contained in:
parent
1e9c87855c
commit
95fc16d90d
|
@ -6,6 +6,7 @@ from typing import Any, AnyStr, Callable, Dict, Iterable, List, MutableMapping,
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import DisallowedHost
|
from django.core.exceptions import DisallowedHost
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
from django.utils.deprecation import MiddlewareMixin
|
||||||
|
|
||||||
from zerver.lib.response import json_error
|
from zerver.lib.response import json_error
|
||||||
from zerver.lib.request import JsonableError
|
from zerver.lib.request import JsonableError
|
||||||
|
@ -228,7 +229,7 @@ def write_log_line(log_data, path, method, remote_ip, email, client_name,
|
||||||
error_data = u"[content more than 100 characters]"
|
error_data = u"[content more than 100 characters]"
|
||||||
logger.info('status=%3d, data=%s, uid=%s' % (status_code, error_data, email))
|
logger.info('status=%3d, data=%s, uid=%s' % (status_code, error_data, email))
|
||||||
|
|
||||||
class LogRequests(object):
|
class LogRequests(MiddlewareMixin):
|
||||||
# We primarily are doing logging using the process_view hook, but
|
# We primarily are doing logging using the process_view hook, but
|
||||||
# for some views, process_view isn't run, so we call the start
|
# for some views, process_view isn't run, so we call the start
|
||||||
# method here too
|
# method here too
|
||||||
|
@ -281,7 +282,7 @@ class LogRequests(object):
|
||||||
error_content=content, error_content_iter=content_iter)
|
error_content=content, error_content_iter=content_iter)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
class JsonErrorHandler(object):
|
class JsonErrorHandler(MiddlewareMixin):
|
||||||
def process_exception(self, request, exception):
|
def process_exception(self, request, exception):
|
||||||
# type: (HttpRequest, Any) -> Optional[HttpResponse]
|
# type: (HttpRequest, Any) -> Optional[HttpResponse]
|
||||||
if hasattr(exception, 'to_json_error_msg') and callable(exception.to_json_error_msg):
|
if hasattr(exception, 'to_json_error_msg') and callable(exception.to_json_error_msg):
|
||||||
|
@ -296,7 +297,7 @@ class JsonErrorHandler(object):
|
||||||
return json_error(_("Internal server error"), status=500)
|
return json_error(_("Internal server error"), status=500)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
class TagRequests(object):
|
class TagRequests(MiddlewareMixin):
|
||||||
def process_view(self, request, view_func, args, kwargs):
|
def process_view(self, request, view_func, args, kwargs):
|
||||||
# type: (HttpRequest, Callable[..., HttpResponse], List[str], Dict[str, Any]) -> None
|
# type: (HttpRequest, Callable[..., HttpResponse], List[str], Dict[str, Any]) -> None
|
||||||
self.process_request(request)
|
self.process_request(request)
|
||||||
|
@ -315,7 +316,7 @@ def csrf_failure(request, reason=""):
|
||||||
else:
|
else:
|
||||||
return html_csrf_failure(request, reason)
|
return html_csrf_failure(request, reason)
|
||||||
|
|
||||||
class RateLimitMiddleware(object):
|
class RateLimitMiddleware(MiddlewareMixin):
|
||||||
def process_response(self, request, response):
|
def process_response(self, request, response):
|
||||||
# type: (HttpRequest, HttpResponse) -> HttpResponse
|
# type: (HttpRequest, HttpResponse) -> HttpResponse
|
||||||
if not settings.RATE_LIMITING:
|
if not settings.RATE_LIMITING:
|
||||||
|
@ -342,7 +343,7 @@ class RateLimitMiddleware(object):
|
||||||
resp['Retry-After'] = request._ratelimit_secs_to_freedom
|
resp['Retry-After'] = request._ratelimit_secs_to_freedom
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
class FlushDisplayRecipientCache(object):
|
class FlushDisplayRecipientCache(MiddlewareMixin):
|
||||||
def process_response(self, request, response):
|
def process_response(self, request, response):
|
||||||
# type: (HttpRequest, HttpResponse) -> HttpResponse
|
# type: (HttpRequest, HttpResponse) -> HttpResponse
|
||||||
# We flush the per-request caches after every request, so they
|
# We flush the per-request caches after every request, so they
|
||||||
|
@ -416,7 +417,7 @@ class SessionHostDomainMiddleware(SessionMiddleware):
|
||||||
httponly=settings.SESSION_COOKIE_HTTPONLY or None)
|
httponly=settings.SESSION_COOKIE_HTTPONLY or None)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
class SetRemoteAddrFromForwardedFor(object):
|
class SetRemoteAddrFromForwardedFor(MiddlewareMixin):
|
||||||
"""
|
"""
|
||||||
Middleware that sets REMOTE_ADDR based on the HTTP_X_FORWARDED_FOR.
|
Middleware that sets REMOTE_ADDR based on the HTTP_X_FORWARDED_FOR.
|
||||||
|
|
||||||
|
|
|
@ -4,14 +4,18 @@ from __future__ import print_function
|
||||||
import sys
|
import sys
|
||||||
import tornado.web
|
import tornado.web
|
||||||
import logging
|
import logging
|
||||||
|
import six
|
||||||
from django import http
|
from django import http
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.handlers.wsgi import WSGIRequest, get_script_name
|
from django.core.handlers.wsgi import WSGIRequest, get_script_name
|
||||||
from django.core.handlers import base
|
from django.core.handlers import base
|
||||||
|
from django.core.handlers.exception import convert_exception_to_response
|
||||||
from django.core.urlresolvers import set_script_prefix
|
from django.core.urlresolvers import set_script_prefix
|
||||||
from django.core import signals
|
from django.core import signals
|
||||||
from django.core import exceptions, urlresolvers
|
from django.core import exceptions, urlresolvers
|
||||||
|
from django.core.exceptions import MiddlewareNotUsed
|
||||||
from django.http import HttpRequest, HttpResponse
|
from django.http import HttpRequest, HttpResponse
|
||||||
|
from django.utils.module_loading import import_string
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
from tornado.wsgi import WSGIContainer
|
from tornado.wsgi import WSGIContainer
|
||||||
from six.moves import urllib
|
from six.moves import urllib
|
||||||
|
@ -21,7 +25,7 @@ from zerver.lib.response import json_response
|
||||||
from zerver.middleware import async_request_stop, async_request_restart
|
from zerver.middleware import async_request_stop, async_request_restart
|
||||||
from zerver.tornado.descriptors import get_descriptor_by_handler_id
|
from zerver.tornado.descriptors import get_descriptor_by_handler_id
|
||||||
|
|
||||||
from typing import Any, Callable, Dict, List
|
from typing import Any, Callable, Dict, List, Optional
|
||||||
|
|
||||||
current_handler_id = 0
|
current_handler_id = 0
|
||||||
handlers = {} # type: Dict[int, AsyncDjangoHandler]
|
handlers = {} # type: Dict[int, AsyncDjangoHandler]
|
||||||
|
@ -85,7 +89,7 @@ class AsyncDjangoHandler(tornado.web.RequestHandler, base.BaseHandler):
|
||||||
|
|
||||||
# Set up middleware if needed. We couldn't do this earlier, because
|
# Set up middleware if needed. We couldn't do this earlier, because
|
||||||
# settings weren't available.
|
# settings weren't available.
|
||||||
self._request_middleware = None # type: ignore # See self._request_middleware block below
|
self._request_middleware = None # type: Optional[List[Callable]]
|
||||||
self.initLock.acquire()
|
self.initLock.acquire()
|
||||||
# Check that middleware is still uninitialised.
|
# Check that middleware is still uninitialised.
|
||||||
if self._request_middleware is None:
|
if self._request_middleware is None:
|
||||||
|
@ -101,6 +105,53 @@ class AsyncDjangoHandler(tornado.web.RequestHandler, base.BaseHandler):
|
||||||
descriptor = get_descriptor_by_handler_id(self.handler_id)
|
descriptor = get_descriptor_by_handler_id(self.handler_id)
|
||||||
return "AsyncDjangoHandler<%s, %s>" % (self.handler_id, descriptor)
|
return "AsyncDjangoHandler<%s, %s>" % (self.handler_id, descriptor)
|
||||||
|
|
||||||
|
def load_middleware(self):
|
||||||
|
# type: () -> None
|
||||||
|
"""
|
||||||
|
Populate middleware lists from settings.MIDDLEWARE. This is copied
|
||||||
|
from Django. This uses settings.MIDDLEWARE setting with the old
|
||||||
|
business logic. The middleware architecture is not compatible
|
||||||
|
with our asynchronous handlers. The problem occurs when we return
|
||||||
|
None from our handler. The Django middlewares throw exception
|
||||||
|
because they can't handler None, so we can either upgrade the Django
|
||||||
|
middlewares or just override this method to use the new setting with
|
||||||
|
the old logic. The added advantage is that due to this our event
|
||||||
|
system code doesn't change.
|
||||||
|
"""
|
||||||
|
self._request_middleware = [] # type: Optional[List[Callable]]
|
||||||
|
self._view_middleware = [] # type: List[Callable]
|
||||||
|
self._template_response_middleware = [] # type: List[Callable]
|
||||||
|
self._response_middleware = [] # type: List[Callable]
|
||||||
|
self._exception_middleware = [] # type: List[Callable]
|
||||||
|
|
||||||
|
handler = convert_exception_to_response(self._legacy_get_response)
|
||||||
|
for middleware_path in settings.MIDDLEWARE:
|
||||||
|
mw_class = import_string(middleware_path)
|
||||||
|
try:
|
||||||
|
mw_instance = mw_class()
|
||||||
|
except MiddlewareNotUsed as exc:
|
||||||
|
if settings.DEBUG:
|
||||||
|
if six.text_type(exc):
|
||||||
|
base.logger.debug('MiddlewareNotUsed(%r): %s', middleware_path, exc)
|
||||||
|
else:
|
||||||
|
base.logger.debug('MiddlewareNotUsed: %r', middleware_path)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if hasattr(mw_instance, 'process_request'):
|
||||||
|
self._request_middleware.append(mw_instance.process_request)
|
||||||
|
if hasattr(mw_instance, 'process_view'):
|
||||||
|
self._view_middleware.append(mw_instance.process_view)
|
||||||
|
if hasattr(mw_instance, 'process_template_response'):
|
||||||
|
self._template_response_middleware.insert(0, mw_instance.process_template_response)
|
||||||
|
if hasattr(mw_instance, 'process_response'):
|
||||||
|
self._response_middleware.insert(0, mw_instance.process_response)
|
||||||
|
if hasattr(mw_instance, 'process_exception'):
|
||||||
|
self._exception_middleware.insert(0, mw_instance.process_exception)
|
||||||
|
|
||||||
|
# We only assign to this when initialization is complete as it is used
|
||||||
|
# as a flag for initialization being complete.
|
||||||
|
self._middleware_chain = handler
|
||||||
|
|
||||||
def get(self, *args, **kwargs):
|
def get(self, *args, **kwargs):
|
||||||
# type: (*Any, **Any) -> None
|
# type: (*Any, **Any) -> None
|
||||||
environ = WSGIContainer.environ(self.request)
|
environ = WSGIContainer.environ(self.request)
|
||||||
|
|
|
@ -344,7 +344,7 @@ TEMPLATES = [
|
||||||
non_html_template_engine_settings,
|
non_html_template_engine_settings,
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE_CLASSES = (
|
MIDDLEWARE = (
|
||||||
# With the exception of it's dependencies,
|
# With the exception of it's dependencies,
|
||||||
# our logging middleware should be the top middleware item.
|
# our logging middleware should be the top middleware item.
|
||||||
'zerver.middleware.TagRequests',
|
'zerver.middleware.TagRequests',
|
||||||
|
|
Loading…
Reference in New Issue