CommonMiddleware is not working in custom middlewares

118 Views Asked by At

CommonMiddleware not working in custom middlewares

I have a custom middleware like below:

class PageNotFoundMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        sura_pattern = r"/sura/[1-9]\d*-[1-9]\d*/$"

        print(f'\n\n{request.path_info}: {response.status_code}\n\n')  # <--

        if response.status_code == 404:
            if re.match(sura_pattern, request.path_info):
                return response
            return render(request, '404.html')
        elif response.status_code == 400:
            return render(request, '400.html')
        elif response.status_code == 500:
            return render(request, '500.html')
        elif response.status_code == 200 or response.status_code == 301:
            return response



In the line I marked with arrow: "<--", the request.path_ifo, has no ending "/".


example:

If the inputted url is: /sura/10, then it shows me /sura/10, but it must append and ending "/" to it. this url is valid, here is the urls.py:

urlpatterns = [
    path("", home, name="home"),

    path('sura/<int:sura>/', sura_handler, name='sura_handler'),  # <-- path which should get the url
    path('sura/<str:sura_aya>/', index, name='index'),
    path('page/<str:page>/', page_handler, name='page_handler'),
    path('juz/<str:juz>/', juz_handler, name='juz_handler'),

    path('api/', include('quran.api.urls')),

    path('sw/', sw, name="sw"),
    path('manifest/', manifest, name="manifest"),
]

Note:

Before regex executed, the response.status_code is 404. While if I correctly input the url, (like this: /sura/10/) then the response.status_code in not 404.

can someone help me please find out why CommonMiddleware doesn't work in custom middlewares?


Middlewares in django:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

    'quran.middleware.PageNotFoundMiddleware'  # <-- custom middleware
]

django version: 4.2

I tried to validate the url in my custom middleware using regex.

I just find out that the CommonMiddleware is not working in custom middlewares in django.

django version: 4.2

1

There are 1 best solutions below

1
Anjan Parajuli On
  1. I had the same error. I found that I added 404.html file in templates and it had some error due to which django couldn't move further into appending slash. So handle it if you have error in that file.

  2. Make sure you have common middleware at top just below security middleware in middleware in settings.py file.