1

我正在尝试通过中间件重定向到带有返回 url 的登录页面。

我收到此错误,因此任何人都可以回答为什么我收到此错误以及如何解决此错误的问题

from django.shortcuts import redirect
def auth_middleware(get_response):
     def middleware(request):
        print("Middleware")
        return_url = request.META['PATH_INFO']
        if not request.session.get('user_id'):
            return redirect(f'account:login?return_url={return_url}')
        response = get_response(request)
        return response

    return middleware
4

1 回答 1

0

Django 将重定向到account:login?return_url=some_url,但浏览器不理解这一点:因为它看到一个以 开头的 URL account:,它假定这account:是协议。

我们可以使用reverse(…)[Django-doc]反转视图:

from django.urls import reverse
from django.http import HttpResponseRedirect

def auth_middleware(get_response):
     def middleware(request):
        print("Middleware")
        return_url = request.META['PATH_INFO']
        if not request.session.get('user_id'):
            return HttpResponseRedirect(f'{reverse("account:login")}?return_url={return_url}')
        response = get_response(request)
        return response

    return middleware

或者您可以使用以下方法制作装饰器:

from django.urls import reverse
from django.http import HttpResponseRedirect
from functools import wraps

def auth_decorator(view):
    @wraps(view)
    def wrapper(request, *args, **kwargs):
        print("Middleware")
        return_url = request.META['PATH_INFO']
        if not request.session.get('user_id'):
            return HttpResponseRedirect(f'{reverse("account:login")}?return_url={return_url}')
        return view(request, *args, **kwargs)

    return wrapper
于 2021-11-24T11:01:52.507 回答