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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:02:47