This video will explain how custom middleware works internally.
Code 1:
from django.contrib.auth.models import User
from jwt import ExpiredSignatureError, InvalidTokenError
from django.utils.deprecation import MiddlewareMixin
from utils.jwt import decode_access_token
class JWTAuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request):
request.user = None # default (like AnonymousUser)
auth_header = request.headers.get("Authorization")
if not auth_header:
return
try:
token = auth_header.split(" ")[1]
payload = decode_access_token(token)
user_id = payload.get("user_id")
user = User.objects.get(id=user_id)
request.user = user
except (ExpiredSignatureError, InvalidTokenError, User.DoesNotExist):
request.user = None
#Code 2:
class A:
def __call__(self):
print("I am called like a function")
a = A()
a()
#
class MiddlewareMixin:
def __call__(self, request):
if hasattr(self, 'process_request'):
response = self.process_request(request)
if response:
return response
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response