Django开发用户认证页面登录报错:'module' object is not callable
Django登录功能TypeError问题解决
问题背景
首次使用Django开发用户认证页面,注册功能正常,但点击登录按钮时触发TypeError错误,应用名为authentication。
报错信息
file "C:\Users\ab\project\authentication\views.py", line 49, in signin user = authentication (request,username=username,password=pass1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: 'module' object is not callable
相关代码
views.py
from django.shortcuts import redirect, render from django.http import HttpResponse from django.contrib.auth.models import User from django.contrib import messages from django.contrib.auth import login, logout import authentication def home(request): return render(request, "authentication/index.html") def signup(request): if request.method == "POST": username = request.POST['username'] fname = request.POST.get('fname') lname = request.POST.get('lname') email = request.POST['email'] pass1 = request.POST['pass1'] pass2 = request.POST['pass2'] myuser = User.objects.create_user(username,email,pass1) myuser.first_name = fname or '' myuser.last_name = lname or '' myuser.save() messages.success(request, "Your account has been successfully created.") return redirect('signin') return render(request, "authentication/signup.html") def signin(request): if request.method == "POST": username = request.POST['username'] pass1 = request.POST['pass1'] user = authentication (request,username=username,password=pass1) if user is not None: login(request,user) fname = user.first_name return render(request,"authentication/index.html", {'fname':fname}) else: messages.error(request,"Bad credentials!") return redirect('home') return render(request, "authentication/signin.html") def signout(request): logout(request) messages.success(request, "logged out successfully!") return redirect('home')
urls.py
from django.urls import path from . import views urlpatterns = [ path('signup/', views.signup, name='signup'), path('signin/', views.signin, name='signin'), path('signout/', views.signout, name='signout'), ]
templates/signin.html
<!DOCTYPE html> <html> <body> <h3>SignIn</h3> {% for message in messages %} <div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert"> <strong>Message:</strong> {{ message }} <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> {% endfor %} <form method="POST" action="{% url 'signin' %}"> {% csrf_token %} <label for="">Username</label> <input type="text" id="username" name="username" placeholder="Enter your username" Required> <br> <label for="">Password</label> <input type="password" id="pass1" name="pass1" placeholder="Enter your password" Required> <br> <button type="submit">Sign In</button> </form> </body> </html>
问题原因及解决方案
核心问题
代码错误导入了自身的authentication应用模块,还试图把模块当作函数调用,才触发了'module' object is not callable错误。Django官方提供的用户认证函数是authenticate,并非自定义的应用模块。
修改步骤
- 修正导入语句:把
views.py中的import authentication替换为from django.contrib.auth import authenticate。 - 修正认证函数调用:把
signin函数里的user = authentication(request, username=username, password=pass1)改成user = authenticate(request, username=username, password=pass1)。
修改后的views.py关键代码片段
from django.shortcuts import redirect, render from django.http import HttpResponse from django.contrib.auth.models import User from django.contrib import messages from django.contrib.auth import login, logout, authenticate # 新增authenticate导入 # ... 其他函数保持不变 def signin(request): if request.method == "POST": username = request.POST['username'] pass1 = request.POST['pass1'] user = authenticate(request, username=username, password=pass1) # 修正函数调用 if user is not None: login(request, user) fname = user.first_name return render(request, "authentication/index.html", {'fname': fname}) else: messages.error(request, "Bad credentials!") return redirect('home') return render(request, "authentication/signin.html")
验证
修改完成后重启Django服务,点击登录按钮即可正常验证用户凭证,完成登录流程。
内容的提问来源于stack exchange,提问作者Arti Bichkunde
相关产品推荐
相关产品推荐

