You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:06:06