账号登录
多账号登录:
- 支持使用注册时的 用户名,和 手机号进行登录
- 这是目前最流行的方式我觉得,给用户的体验也是最好的。 信息化时代,任何网站都需要账号。 众多的用户名。。。我是记不住。 但是同一个特点是都支持手机号登录。
- 我们可以输入手机号 和密码进行登录。
登录流程(同注册时讲的一样)
- 接收,验证,处理,响应
- (1)处理当中的 保持登录状态 以及后续的退出登录,都已经讲过了。
- (2)我们在登陆成功之后,肯定是跳转到首页的。 然后显示用户名的操作:
- 方案一:模板中 request 变量直接渲染用户名 , 缺点:不方便做首页静态化
- 方案二:发送ajax请求获取用户信息,缺点:需要发送网络请求
- 方案三:Vue读取cookie渲染用户信息
- 综合来讲我们使用 方案三。所以处理操作中,需要增加写入 用户信息,cookie的操作。
自定义认证后端
- 我们打开官网,找到认证登录的模块
- (1) 发现,认证用户存在。是通过一个authenticate( ) 方法。
- 方法描述已经十分清晰了。 我们知道这个函数并不能‘直接’认证用户, 而是 (1)默认接收 用户名(username)和密码(password),对着两个参数进行验证。(2 )并且 可以选择性的接收一个request参数(这个在某些情况下会使用到,因为request对象中包含了很多信息)
- 我们就来看下默认的认证后端,如何设置的:
- 我们知道了,在 AUTHENTICATION_BACKENDS 配置项中,可以添加认证后端,默认的只有一个,就是我们的默认认证后端,并且会尝试所有的认证后端,在前面一个认证失败的情况下。 下面只需要编写我们自己的认证后端,去处理 多账户登录,在添加到这个即可。
编写多用户认证后端
class MeiduoModelBackend(ModelBackend): # 继承django提供的认证系统
def authenticate(self, request, username=None, password=None, **kwargs):
user = super().authenticate(request, username=username, password=password)
# print(user)
if user is not None:
return user
else:
# except:
# 如果未查到数据,则返回None,用于后续判断
try:
user = User.objects.get(mobile=username)
except:
return None
else:
# 判断密码
if user.check_password(password):
return user
else:
return None
这样,很简单的代码。我们就可以实现 手机号登录啦。
首页用户名展示
-
登录成功跳转到首页,显示用户名等信息
-
谁来写cookie?
-
我们翻看文档,查看HttpResponse对象,是具有这个功能的
-
不仅如此,他的子类同样都拥有这些功能
包括 JsonResponse对象 也是 HttpResponse 的一个子类。 -
那么上代码:
# 响应注册结果
# 重定向到首页,命名空间和 应用名就讲了
response = redirect(reverse('contents:index'))
# 注册时用户名写入到cookie,有效期15天
response.set_cookie('username', user.username, max_age=3600 * 24 * 15) # 以秒为单位
return response
over!