text: # Copyright 2017 Google LLC All Rights Reserved.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  """Django middleware helper to capture a request.
  
  The request is stored on a thread-local so that it can be
  inspected by other helpers.
  """
  
  import threading
  
  
  _thread_locals = threading.local()
  
  
  def _get_django_request():
      """Get Django request from thread local.
  
      :rtype: str
      :returns: Django request.
      """
      return getattr(_thread_locals, 'request', None)
  
  
  try:
      # Django >= 1.10
      from django.utils.deprecation import MiddlewareMixin
  except ImportError:
      # Not required for Django <= 1.9, see:
      # https://docs.djangoproject.com/en/1.10/topics/http/middleware/#upgrading-pre-django-1-10-style-middleware
      MiddlewareMixin = object
  
  
  class RequestMiddleware(MiddlewareMixin):
      """Saves the request in thread local"""
  
      def __init__(self, get_response=None):
          self.get_response = get_response
  
      def process_request(self, request):
          """Called on each request, before Django decides which view to execute.
  
          :type request: :class:`~django.http.request.HttpRequest`
          :param request: Django http request.
          """
          _thread_locals.request = request
  