如何从 Django 中的中间件重定向 url?
How to redirect url from middleware in Django?
如何从中间件重定向 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
对服务器的每个请求都通过中间件。因此,当您转到 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
您应该使用类似 login_required
的装饰器,请参阅 Django authentication system 了解更多详细信息。
示例:
from django.contrib.auth.decorators import login_required
@login_required(login_url="/your/login/view/url/")
def my_view(request):
...
根据 docs
,尽可能避免使用中间件进行任何类型的重定向
Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.
换句话说,中间件用于处理请求和响应,如果您重定向到任何视图,您将(可能)递归地触发您的中间件。
并且,另一方面...
以后可能要添加一个可以被匿名用户访问的视图,这个中间件会有问题...
如何从中间件重定向 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
对服务器的每个请求都通过中间件。因此,当您转到 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
您应该使用类似 login_required
的装饰器,请参阅 Django authentication system 了解更多详细信息。
示例:
from django.contrib.auth.decorators import login_required
@login_required(login_url="/your/login/view/url/")
def my_view(request):
...
根据 docs
,尽可能避免使用中间件进行任何类型的重定向Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.
换句话说,中间件用于处理请求和响应,如果您重定向到任何视图,您将(可能)递归地触发您的中间件。
并且,另一方面...
以后可能要添加一个可以被匿名用户访问的视图,这个中间件会有问题...