Как перенаправить URL из промежуточного программного обеспечения в Django? - PullRequest
0 голосов
/ 05 февраля 2019

Как перенаправить URL-адрес из промежуточного программного обеспечения?

Проблема бесконечного цикла.

Я намерен перенаправить пользователя на URL-адрес регистрации клиента, если регистрация еще не завершена.

def check_user_active(get_response):
    def middleware(request):
        response = get_response(request)

        try:
            print(Cliente.objects.get(usuario_id=request.user.id))
        except Cliente.DoesNotExist:
            return redirect('confirm')


        return response
    return middleware

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы должны использовать login_required как декоратор, см. Система аутентификации Django для более подробной информации.

Пример:

from django.contrib.auth.decorators import login_required

@login_required(login_url="/your/login/view/url/")
def my_view(request):
    ...

Избегайте использования промежуточного программного обеспечения для любого видаперенаправления всегда можно, в соответствии с документами

Промежуточное программное обеспечение - это структура хуков в обработке запросов / ответов Django.Это легкая низкоуровневая «плагинная» система для глобального изменения входных или выходных данных Django.

Другими словами, есть промежуточное программное обеспечение для обработки запросов и ответов, если вы перенаправляете на любое представление, вы будете(потенциально) рекурсивно активировать ваше промежуточное ПО.

И, с другой стороны ...

В будущем вы можете захотеть добавить представление, которое могут посещать анонимные пользователи, это промежуточное ПОбудет проблема ...

0 голосов
/ 05 февраля 2019

Каждый запрос к серверу проходит через Middleware.Следовательно, когда вы переходите на страницу confirm, запрос снова проходит через промежуточное ПО.Так что лучше поставить здесь какое-то условие, чтобы игнорировать confirm url.Вы можете попробовать вот так:

def check_user_active(get_response):
    def middleware(request):
        response = get_response(request)
        if not request.path == "confirm":
            try:
                print(Cliente.objects.get(usuario_id=request.user.id))
            except Cliente.DoesNotExist:
                return redirect('confirm')
        return response
    return middleware
...