【问题标题】:How to redirect url from middleware in Django?如何从 Django 中的中间件重定向 url?
【发布时间】:2019-02-05 05:39:37
【问题描述】:
如何从中间件重定向 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
【问题讨论】:
标签:
python
django
python-3.x
django-2.1
【解决方案1】:
对服务器的每个请求都通过中间件。因此,当您要去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
【解决方案2】:
您应该使用类似 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,尽可能避免使用中间件进行任何类型的重定向
中间件是 Django 请求/响应处理的挂钩框架。这是一个轻量级的低级“插件”系统,用于全局更改 Django 的输入或输出。
换句话说,中间件用于处理请求和响应,如果您重定向到任何视图,您将(可能)递归地触发您的中间件。
另一方面...
以后你可能想添加一个匿名用户可以访问的视图,这个中间件会出问题...