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