我想提出一个登录页面和Django通过任何用户名或邮箱登录。我开始一个应用程序的用户,在此应用程序,我已经定制了用户/ model.py
class UserProfile(AbstractUser):
pass
在我的用户/ views.py,我的代码读取输入名称=“用户名”
from .models import UserProfile
from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username)) | Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None
def login(request):
if request.method == "POST":
user_name = request.POST.get('username', '')
password = request.POST.get('password', '')
user = authenticate(username=user_name, password=password)
if user is not None:
auth_login(request,user)
return render(request, 'index.html')
else:
return render(request, 'login.html',{})
elif request.method == 'GET':
return render(request,"login.html",{})
我的模板/ login.html的
<form action="/login/" method="post" id="jsLoginForm" autocomplete="off">
<input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
<div class="form-group marb20">
<label>Username</label>
<input name="username" id="account_l" type="text" placeholder="username or email" />
</div>
<div class="form-group marb8">
<label>Password</label>
<input name="password" id="password_l" type="password" placeholder="Enter your password" />
</div>
<div class="error btns login-form-tips" id="jsLoginTips"></div>
<div class="auto-box marb38">
<label><input type="checkbox" id="jsAutoLogin"> Auto login</label>
<a class="fr" href="forgetpwd.html">forget pwd?</a>
</div>
<input class="btn btn-green" id="jsLoginBtn" type="submit" value="login > " />
{% csrf_token %}
</form>
在urls.py
from users.views import login
urlpatterns = [
url('^login/$',login, name='login'),
]
在settings.py
AUTH_USER_MODEL = 'users.UserProfile'
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.ModelBackend",
'users.views.CustomBackend',
]
其结果是,我可以登录使用的用户名和密码,它打印:
[03/Feb/2019 23:40:06] "POST /login/ HTTP/1.1" 200 37066 #
但是当我在我的浏览器的电子邮件和密码,没有任何变化登录。在终端,它打印:
Not Found: /user/login/
[03/Feb/2019 23:41:30] "POST /user/login/ HTTP/1.1" 404 2213
我不知道这条道路“/用户/登录/”从何而来,它是从一个“/登录/”前不同。
解决:我发现这个问题是我从教程复制代码造成的,还有包括像`$阿贾克斯(网址:{url:“/用户/登录/”,})一login.js。而这发生在我使用电子邮件登录。
请检查您使用的不是地方...
url(r'user/', include(users.urls))
并尝试使用{% url ... %}
标记为表单action属性。
在另一方面,我想你应该首先尝试把你的CustomBackend
名单:
AUTHENTICATION_BACKENDS = [
'users.views.CustomBackend',
"django.contrib.auth.backends.ModelBackend"
]
您可以从文档阅读,为了事项:
AUTHENTICATION_BACKENDS事项的顺序,因此,如果同样的用户名和密码在多个后端有效,Django会在第一次正面比赛停止处理。
如果一个后端提出了PermissionDenied例外,认证会立即失效。 Django会不会检查后面的后端。
也许默认后端没有找到用户(你正在寻找通过电子邮件)。