django urls without a trailing slash do not redirect

前端 未结 6 1896
不思量自难忘°
不思量自难忘° 2020-12-02 07:07

I\'ve got two applications located on two separate computers. On computer A, in the urls.py file I have a line like the following:

(r\'^cast/$\         


        
6条回答
  •  南笙
    南笙 (楼主)
    2020-12-02 07:32

    Append slash without redirect, use it instead of CommonMiddleware in settings, Django 2.1:

    MIDDLEWARE = [
        ...
        # 'django.middleware.common.CommonMiddleware',
        'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect',
        ...
    ]
    

    Add to your main app directory middleware.py:

    from django.http import HttpResponsePermanentRedirect, HttpRequest
    from django.core.handlers.base import BaseHandler
    from django.middleware.common import CommonMiddleware
    from django.conf import settings
    
    
    class HttpSmartRedirectResponse(HttpResponsePermanentRedirect):
        pass
    
    
    class CommonMiddlewareAppendSlashWithoutRedirect(CommonMiddleware):
        """ This class converts HttpSmartRedirectResponse to the common response
            of Django view, without redirect.
        """
        response_redirect_class = HttpSmartRedirectResponse
    
        def __init__(self, *args, **kwargs):
            # create django request resolver
            self.handler = BaseHandler()
    
            # prevent recursive includes
            old = settings.MIDDLEWARE
            name = self.__module__ + '.' + self.__class__.__name__
            settings.MIDDLEWARE = [i for i in settings.MIDDLEWARE if i != name]
    
            self.handler.load_middleware()
    
            settings.MIDDLEWARE = old
            super(CommonMiddlewareAppendSlashWithoutRedirect, self).__init__(*args, **kwargs)
    
        def process_response(self, request, response):
            response = super(CommonMiddlewareAppendSlashWithoutRedirect, self).process_response(request, response)
    
            if isinstance(response, HttpSmartRedirectResponse):
                if not request.path.endswith('/'):
                    request.path = request.path + '/'
                # we don't need query string in path_info because it's in request.GET already
                request.path_info = request.path
                response = self.handler.get_response(request)
    
            return response
    

提交回复
热议问题