有很多网站的登录不但可以使用网站账号密码,还能用注册的邮箱和手机号进行登录,现在就用Django实现这个功能。
Django默认的认证方式是使用username和password字段进行认证的,我们可以加上一个通过email字段获取用户的认证后台来登录。一个认证后台就是一个实现了authentication和get_user方法的python类,首先在应用目录创建一个authenticate.py文件,编辑代码:
from dajngo.contrib.auth.models import User
class EmailAuthenBackend(object):
def authentication(self,username=None,password=None):
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self,user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
最后在settings.py设置:
AUTHENTICATION_BACKENDS=['django.contrib.auth.backends.ModelBackend',#默认的后台
'blog.authenticate.EmailAuthenBackend'#假设我们的应用名为blog]
注意,Django认证会对每个后台按顺序进行,例如在这里先在第一个后台查找,找到了就停止,没找到就接着查找下一个,直到查找完成为之,如果所有后台都查找不到才会弹出错误信息。
第三方登录
'social_django',
'social.apps.django_app.default'
]
更新数据库:python manage.py migrate
在认证后端AUTHENTICATION_BACKENDS添加qq认证:
AUTHENTICATION_BACKENDS=[
'social_core.backends.qq.QQOAuth2'
]
添加ID和KEY:
SOCIAL_AUTH_QQ_KEY='app_id'
SOCIAL_AUTH_QQ_SECRET='secret_key'
SOCIAL_AUTH_QQ_USER_OPENID_AS_USERNAME=True
在根路由添加URL:
urlpatterns = [
url('',include('social_django.urls',namespace='social'))
]
在需要登录的地方加入:
<a href='{% url 'social:begin' 'qq' %}'>QQ登录</a>