Django Middleware, которое перенаправляет на https

Я пытаюсь создать промежуточное программное обеспечение в своем проекте Django, которое перенаправляет пользователя на ссылку «https», если его запрос изначально не был https. Приведенный ниже код не перенаправляет пользователя ни в одном из тестов, которые я запускал (например, пользователь вводит «www.example.com», «http://example.com,', http://www.example.com ', так далее.

Может ли кто-нибудь из вас обнаружить проблему с этим кодом? Обычно я бы использовал операторы печати, чтобы увидеть, какой путь установлен, но я не могу сделать это на своем действующем сервере (или, по крайней мере, я не знаю, как это сделать):

from django.http import HttpResponseRedirect

from django.utils.deprecation import MiddlewareMixin

class RedirectMiddleware(MiddlewareMixin):

    def process_request(self, request):

        host = request.get_host()

        if host == 'www.example.com' or 'example.com':

           path = request.build_absolute_uri()
           domain_parts = path.split('.')

           if domain_parts[0] == 'http://www':
               path = path.replace("http://www","https://www")
               return HttpResponseRedirect(path)

           elif domain_parts[0] == 'www':
               path = path.replace("www","https://www")
               return HttpResponseRedirect(path)

           elif domain_parts[0] == 'http://example':
               path = path.replace("http","https")
               return HttpResponseRedirect(path)

           elif domain_parts[0] == 'example':
               path = path.replace("example","https://www.example")
               return HttpResponseRedirect(path)

           else:
               pass

       else:
           pass

Еще раз спасибо ребята


person Jason Howard    schedule 28.03.2018    source источник
comment
Я думаю, вам следует перенаправлять пользователей с помощью веб-сервера (Nginx, Apache), а не промежуточного программного обеспечения.   -  person latsha    schedule 28.03.2018
comment
Ok. Я считаю, что для этого мне следует использовать Nginx или Apache, но можете ли вы объяснить, почему?   -  person Jason Howard    schedule 28.03.2018
comment
Для этого есть настройка: SECURE_SSL_REDIRECT.   -  person Kevin Christopher Henry    schedule 28.03.2018
comment
Посмотрите, прежде всего, каждый отдельный запрос проходит через веб-сервер, а затем переходит к вашему приложению (django в вашем случае), поэтому, если вы перенаправите пользователя на первом этапе, вы сэкономите некоторые ресурсы (нет необходимости анализировать URL-адрес, писать логику и т. д.).   -  person latsha    schedule 28.03.2018


Ответы (1)


Вы можете добавить следующее в файл настроек

SECURE_SSL_REDIRECT = True

См. https://docs.djangoproject.com/en/2.1/ref/middleware/#ssl-redirect

Вам также необходимо добавить следующее к промежуточному программному обеспечению

'django.middleware.security.SecurityMiddleware',

Это настройки, доступные в Django 1.8+.

person Pranay Majmundar    schedule 14.09.2018
comment
Когда я пытаюсь это сделать, я получаю сообщение об ошибке, указывающее, что слишком много перенаправлений, а затем ошибку 503. Есть идеи, почему? - person Josh Grinberg; 12.02.2019