用户验证方式可用cookie+session方式或token方式
1.基本概念
1.1cookie+session方式
基本原理:用户登录时,后台验证密码有效后,通过算法生成一段id分配给一个cookie值返回前端,后端将随机id存储为session值;以后用户每次请求时后端都通过cookie带的值来与数据库的session对比查看cookie的有效性。
优点:常规的登入,退出操作
弊端:服务端需要存储信息,每次请求都要查数据库
1.2token方式
基本原理:用户登录时,后台验证密码有效性后,通过一定加密算法计算后分配给前端一个token值;以后用户每次带token请求,后台通过特定算法计算token是否有效
优点:不需要后台存储信息
缺点:token分配出去后在有效期内都不能撤回,若用加黑名单方式撤回则会丧失token的优势
2.Django中实现
2.1 cookie+session
cookie操作
from django.shortcuts import render, HttpResponse
# 设置cookie
def set_cookie(request):
response = HttpResponse('设置cookie')
# 设置cookie
response.set_cookie('num', 10, max_age=3600 * 24 * 14)
return response
# 读取cookie
def get_cookie(request):
# 通过 键 获取值
num = request.COOKIES['num']
return HttpResponse(num)
session操作
def set_session(request):
# 设置session
request.session['username'] = 'zs'
request.session['age'] = 18
# request.session.set_expiry(2) # 2s后过期
# 默认是14天后过期, 0 表示关闭浏览器过期
# 5s 表示 5s后过期
return HttpResponse('设置session')
def get_session(request):
"""获取session"""
username = request.session['username']
age = request.session['age']
return HttpResponse(username + ":" + str(age))
# 删除session
def clear_session(request):
request.session.flush() # 将整条记录删除
request.session.clear() # 删除内容部分
# 删除指定的key
del request.session['username']
return HttpResponse('清除成功')
Django项目默认开启session的,会在数据库中生成响应的存储表
在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。
session存储可用一下几种方式:
1.默认的数据库
2.本地缓存
3.中间件缓存:如Redis。由于session访问频率很高,所以提高性能可用Redis。
2.2 token
加密算法的定义:需要达到的效果:token具有有效期,不易被计算出来(用户信息+salt+日期信息...组合)
token操作与cookie相似,都是对http header进行相关字段的添加
Django自带的用户验证
from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.decorators import login_required
from django.contrib import auth
from django.contrib.auth.models import User
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
# Return a 'disabled account' error message
...
else:
# Return an 'invalid login' error message.
验证模块与user要一起使用:
#注册
def reg(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
user = User.objects.create_user(username=user,password=pwd)
return redirect('/login/')
return render(request,'reg.html')
def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))