cookie session
解决问题:
比较:
Session 存储引擎
存储session的容器,封装一系列方便操作session_key或session的方法,例如get、save、create等,同时实现__getitem__、setitem、delitem、__contains__方法,实现字典操作session。
Django 有哪些存储容器?根据配置文件选用:SESSION_ENGINE
session的操作:
1. 如果操作Session
写:
request.session["user_id"] = user.id
查看:
request.session.get('user_id')
request.session['user_id'],不推荐,不存在会报错
request.session.keys()、request.session.items()
删除:
del request.session['user_id']
request.session.pop(key)
存在判断:
'user_id' in request.session
配置项:
Django两个重要的中间件:
Django 自带了两个中间件:SessionMiddleware 与 AuthenticationMiddleware
(AuthenticationMiddleware 依赖 SessionMiddleware)
分别在(注意引入顺序):
'django.contrib.sessions.middleware.SessionMiddleware'
'django.contrib.auth.middleware.AuthenticationMiddleware'
Sessionmiddleware
1. views里面为何能直接操作session?
django.contrib.sessions.middleware.SessionMiddleware
2. 功能实现:
__init__初始化:
1. 动态导入对应的配置Session存储引擎
process_request:
1. 从Cookie中获取session_id
2. 初始化Session存储引擎
process_response:
1. 保存session
2. 写cookie
AuthenticationMiddleware
1. views里面为何能直接操作user对象?
django.contrib.sessions.middleware.AuthenticationMiddleware
2. 功能实现:
process_request:
1. 从session中获取session_id
2. 通过session_id获取登陆用户,没有
则返回一个匿名用户AnoymouseUser
login_required装饰器
登陆限制装饰器:AuthenticationMiddleware绑定的对象进行校验,看是用户还是匿名用户
例如:
api_login_required
weixin_partner_login_required (get_user_from_request)
相关登陆校验器
认证工作流程
Django 认证提供了认证(authentiaction)和授权(authorization)两种功能,
认证相关功能集中于auth模块,它提供了登录、注册、效验、修改密码、注销、验证用户是否登录等功能。
Django的认证主要是用户名和密码验证。
表关系
User表操作
在认证系统中User对象是其核心部分。完整的路径: django.contrib.auth.models.User
用户创建:
User.objects.create_user
User.objects.create_superuser
密码修改:
user.set_password('新的密码')
密码检查:
user.check_password('密码')
登录验证:
from django.contrib.auth import authenticate
user = authenticate(username=d, password='111111') # 验证通过,返回一个User对象。
分布式session
概念:
单服务器web应用中,session只会存储在该服务器中。
随着日益增长的用户量,单服务节点无法应对大量用户的访问,我们开始考虑适用服务器集群,
例如采用nginx做负载均衡反向代理,那么就会出现用户每次访问都会轮询到不同的web应用服务器节点,
从而导致获取不到Session的情况。