Django自定义登录日志视图时出现‘function’ object has no attribute ‘get’错误求助
问题排查与解决
Hey,我一眼就看出问题出在哪了——你的自定义login函数返回的不是Django期望的响应对象,而是直接返回了LoginView.as_view()生成的视图函数本身。Django调用你的视图函数后,会尝试把返回值当成HttpResponse来处理,结果发现是个普通函数,自然就报错说'function' object has no attribute 'get'了。
下面给你两种靠谱的解决方案,第二种更符合Django的最佳实践:
方案1:在函数视图里调用类视图
修改你的views.py,让自定义函数先记录日志,再调用内置的登录视图处理请求:
from django.contrib.auth import views as auth_views def login(request): ip = get_client_ip(request) logger.info(f'user access: {request.user} via ip:{ip}') # 先实例化登录视图,再传入当前请求调用它 login_view = auth_views.LoginView.as_view(template_name='website/login.html') return login_view(request)
这样你的函数就会返回正确的响应对象,Django就能正常处理了。
方案2:继承LoginView类(更推荐)
既然Django的登录系统是基于类视图设计的,直接继承并重写方法会更优雅,也方便后续扩展:
from django.contrib.auth.views import LoginView class CustomLoginView(LoginView): template_name = 'website/login.html' def dispatch(self, request, *args, **kwargs): # 日志记录逻辑放在dispatch里,它是请求处理的入口 ip = get_client_ip(request) logger.info(f'user access: {request.user} via ip:{ip}') # 调用父类的dispatch继续处理登录流程 return super().dispatch(request, *args, **kwargs)
然后更新urls.py指向这个自定义类视图:
from .views import CustomLoginView path('login/', CustomLoginView.as_view(), name='login-page'),
这种方式完全贴合Django的设计模式,后续如果要加权限校验、请求预处理之类的逻辑,直接在类里加方法就行,代码结构更清晰。
最后提醒下:确保你用到的get_client_ip函数已经正确实现了,不然可能会触发新的错误哦~
内容的提问来源于stack exchange,提问作者Hamzah Zabin
相关产品推荐
相关产品推荐

