Django登录校验中间件报'bool' object is not callable错误如何解决
错误原因
- 该报错是因为Django 1.10及之后的版本中,
request.user.is_authenticated从可调用方法调整为布尔类型的属性,你代码中加了()相当于尝试调用布尔值,因此触发TypeError: 'bool' object is not callable错误。
修复方案
将代码中所有request.user.is_authenticated()后的括号去掉,改为request.user.is_authenticated即可。
修改后的完整代码如下:
import re from django.conf import settings from django.shortcuts import redirect EXEMPT_URL = [re.compile(settings.LOGIN_URL.lstrip('/'))] if hasattr(settings, 'LOGIN_EXEMPT_URLS'): EXEMPT_URL += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS] class LoginRequiredMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self,request): response = self.get_response(request) return response def process_view(self,request, view_func, view_args, view_kwargs): assert hasattr(request,'user') path = request.path_info print(path) if not request.user.is_authenticated: if not any(url.match(path) for url in EXEMPT_URL): return redirect(settings.LOGIN_URL) url_is_exempt = any(url.match(path) for url in EXEMPT_URL) if request.user.is_authenticated and url_is_exempt: return redirect(settings.LOGIN_REDIRECT_URL) elif request.user.is_authenticated or url_is_exempt: return None else: return redirect(settings.LOGIN_URL)
补充说明:如果你维护的是Django 1.9及更早的旧版本项目,
is_authenticated仍为方法需要保留括号,可根据项目实际使用的Django版本选择对应写法。目前主流的Django 2.x、3.x、4.x、5.x版本均使用属性写法,无需加括号。
内容的提问来源于stack exchange,提问作者panti
相关产品推荐
相关产品推荐

