[py][mx]django自定义认证类-实现邮箱作为用户名登录
2018-01-31 22:35
671 查看
创建自定义验证用户名密码类CustomBackend
users/views.pyfrom django.contrib.auth import authenticate, login from django.contrib.auth.backends import ModelBackend from django.shortcuts import render # Create your views here. from users.models import UserProfile class CustomBackend(ModelBackend): # 继承认证类,diy它 def authenticate(self, request, username=None, password=None, **kwargs): try: # 验证用户名密码 否则返回None user = UserProfile.objects.get(username=username) # 表示有这个用户 查处自定义usermodel的用户名, if user.check_password(password): # 表示这个用户密码正确, 这里django存储密码是加密的,必须用其下这个方法加密后比对是否正确 return user except Exception as e: return None # 密码错误返回None def user_login(request): if request.method == "POST": user_name = request.POST.get("username", "") pass_word = request.POST.get("password", "") user = authenticate(username=user_name, password=pass_word) if user is not None: # 用户名密码验证成功 login(request, user) # django执行用户登录 return render(request, "index.html") else: return render(request, "index.html", {}) elif request.method == "GET": return render(request, "login.html", {})
users/settings.py
AUTHENTICATION_BACKENDS = ('users.views.CustomBackend',)
断点调试, 确实已经用了我们自定义的认证类.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/05/886f2e65ca41a2de798553e8c94e077f.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/05/ac281ca4d515798c5d3a834fe183e99b.png)
允许用户名用邮箱登录
且的关系 user = UserProfile.objects.get(username=username,email=username) 或的关系: django自带了Q实现 from django.db.models import Q user = UserProfile.objects.get(Q(username=username) | Q(email=username))
users/views.py完整的
from django.contrib.auth import authenticate, login from django.contrib.auth.backends import ModelBackend from django.db.models import Q class CustomBackend(ModelBackend): # 继承认证类,diy它 def authenticate(self, request, username=None, password=None, **kwargs): try: # 验证用户名密码 否则返回None user = UserProfile.objects.get(Q(username=username) | Q(email=username)) # 表示有这个用户 查处自定义usermodel的用户名, if user.check_password(password): # 表示这个用户密码正确, 这里django存储密码是加密的,必须用其下这个方法加密后比对是否正确 return user except Exception as e: return None # 密码错误返回None
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/05/0f667c9f92986fea51f3721190e000be.png)
前端输错用户名密码错误提示
users/views.pydef user_login(request): if request.method == "POST": user_name = request.POST.get("username", "") pass_word = request.POST.get("password", "") user = authenticate(username=user_name, password=pass_word) if user is not None: # 用户名密码验证成功 login(request, user) # django执行用户登录 return render(request, "index.html") else: return render(request, "login.html", {'msg':"用户名或密码错误"}) elif request.method == "GET": return render(request, "login.html", {})
templates/login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <div> <form action="/login/" method="post"> <p><input type="text" name="username" placeholder="username"></p> <p><input type="text" name="password" placeholder="password"></p> <p><input type="submit"></p> {% csrf_token %} </form> {{ msg }} </div> </body> </html>
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/05/7b0549a4f0c086f38b578885cfcc83f0.png)
相关文章推荐
- Django自定义UserModel并实现认证和登录
- django学习——通过邮箱实现用户名的登录
- 怎么实现使用手机号、邮箱、用户名登录
- sql and&or用法 实现jsp邮箱或者用户名登录
- 手机号、邮箱或者用户名登录的实现方法
- shopnc 实现手机、邮箱、用户名登录
- [py][mx]django处理登录逻辑
- [py][mx]django通过邮箱找回密码
- [py][mx]django实现根据城市和课程机构类别过滤
- [py][mx]django的cookie和session操作-7天免登录
- [py][mx]django项目-让系统用自定义的users表认证
- [py][mx]django邮箱注册的验证码部分-django-simple-captcha库使用
- django中的认证(含自定义认证)与登录
- [原创]django+ldap+memcache实现单点登录+统一认证
- CAS 实现单点登录(SSO)数据库查询认证机制-自定义编码方式(四)
- django如何用邮箱代替用户名登录
- Django用自定义cookies 实现登录,注册,退出
- flask实现同时使用用户名/邮箱其一进行登录
- 使用gSOAP开发实例(8) -- 自定义header实现用户名令牌认证(Usernametoken Authentication)