【Django】教程-1-安装+创建项目+目录结构介绍
【Django】教程-2-前端-目录结构介绍
【Django】教程-3-数据库相关介绍
【Django】教程-4-一个增删改查的Demo
【Django】教程-5-ModelForm增删改查+规则校验【正则+钩子函数】
【Django】教程-6-搜索框-条件查询前后端
【Django】教程-7-分页,默认使用django的
【Django】教程-8-页面时间组件
15. 用户认证,可以多种方式后面会介绍
15.1
浏览器登录服务器,服务器给浏览器凭证,服务器自己存一个凭证;下次带着凭证过来,服务器验证凭证,验证通过,可继续操作
登录成功views中login添加,下面这行代码相当于:① 会给浏览器生成一个cookie的随机字符串;
② 服务器数据库记录这个随机字符串在django_session表中;
③ 服务器记录info=小明,session, 当然你可以使用任意属性,不一定是key,可以自定义属性名字随便起。
request.session("info")="小明"
例如:
python
def login(req):
"""用户登录"""
""" modelform 方式添加用户"""
if req.method == 'GET':
user = LoginForm()
return render(req, 'login/login.html', {"user": user})
# 用户post提交,数据校验
user = LoginForm(data=req.POST)
if user.is_valid():
# 生成cookie和session
req.session["key"] = {"username": req.POST.get("username")}
return redirect("/admin/list")
# # 校验失败, 在页面上展示错误信息
return render(req, 'login/login.html', {"user": user})
对每个页面添加,判断,如果没有登录属性,就跳转到登陆页面
python
def admin_list(request):
# 每一个views中,都需要添加,认证信息,如果没有,就跳转到登录
request.session.get("key")
if not info:
return redirect("/login/")
15.2 中间件方式

- 定义中间件
python
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
class AuthMiddleware(MiddlewareMixin):
def process_request(self, request):
print("M1 进来了!")
# 如果没有返回值,返回None,继续往下走
# 如果有返回值,HttpResponese 返回了,不往下走了
# 如果是登录请求,请求继续
if request.path_info == '/login/':
return
# 1. 读取当前访问的用户session信息,说明已经登录过,可以继续往下走
info_dict = request.session.get("info")
print(info_dict)
if info_dict:
# 继续往下走
return
# 如果没有登录信息,去登录页面
return redirect('/login/')
def process_response(self, response):
print("M1 走了!")
return response
- 应用中间件,
settings.py
python
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'appTang.middleware.LoginMiddleware.LoginRequiredMiddleware',
'appTang.middleware.auth.AuthMiddleware'
]
- 登录views
account.py
python
from django.shortcuts import render, redirect
from appTang.forms import LoginForm
def login(req):
"""用户登录"""
""" modelform 方式添加用户"""
if req.method == 'GET':
user = LoginForm()
return render(req, 'login/login.html', {"user": user})
# 用户post提交,数据校验
user = LoginForm(data=req.POST)
if user.is_valid():
# 需要添加用户认证成功信息
req.session["info"] = {"username": req.POST.get("username")}
print("登录成功")
return redirect("/admin/list")
# # 校验失败, 在页面上展示错误信息
return render(req, 'login/login.html', {"user": user})
- 退出
python
def logout(req):
"""注销"""
req.session.clear();
return redirect("/admin/list")