Django2.1通过中间件session验证实现登录验证功能
Django内置权限管理
Django是有内置的权限管理模块的,喜欢内置模块的同学可以使用内置的Auth模块,官方文档上有教程的。
Auth需要使用内置的User model,用起来总觉得有点别扭。不过我们可以参考Auth的源码,打造一个自定义的登录验证模块,按需定制。
自定义登录验证
思路
- 自建User模型
- 编写登录函数,登录成功则存入session
- 编写中间件,在中间件中验证session,如不存在session则重定向到登录页面
栗子
-
建立 User模型,这个自己随意,爱咋咋,别给username和password漏了就行。
-
编写登录函数
这个登录函数仅仅是示例,想要更多内容还是自己添加吧。
# 用户登录函数
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
md5 = hashlib.md5()
md5.update(password.encode())
password = md5.hexdigest()
info = models.Users.objects.filter(username=username, password=password)
if info:
# 存入session
request.session['key'] = username
return redirect(reverse('登录成功后要跳转的页面'))
else:
return HttpResponse(
"<script>alert('账号或密码错误,回去吧!');window.location.href='" + reverse('登录页别名') + "'</script>")
if request.method == 'GET':
return render(request, '登录页')
-
中间件
玩具版中间件
from django.shortcuts import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin
# 自定义中间件类
class UsersAuthMiddleWare(MiddlewareMixin):
def process_request(self, request):
# 获取session内用户的登录标识
key = request.session.get('key', 0)
# 判断用户是否登录,访问路径是不是登录页面
if key == 0 and request.path != '/login':
# 未登录,重定向到登录页面
return HttpResponseRedirect('/login')
- 定义好中间件别忘了注册
总结
通过session完成登录验证。
数据库查询成功则存入正确的session,在中间件中过滤掉非法session。