python学习Day64
Day 64
今日内容概要
- cookie与session简介
- 什么是cookie和session
- django操作cookie
- django操作session
- django中间件
- 中间件简介
- 中间件使用场景
- 自定义中间件的五个方法
今日内容详细
一.cookie与session简介
"""
HTTP协议四大特性:
1.基于请求响应
2.基于TCP、IP作用于应用层之上协议
3.无状态(服务端无法识别客户端的状态)
互联网刚兴起时,所有人访问的网址都是一样的数据,服务端无法识别客户端
后来随着互联网发展,服务端需记住客户端的状态(密码等,否则不知道谁是谁)
cookie与session应运而生
4.无连接
"""
1.什么是cookie和session?
cookie:保存在客户端上跟用户信息(状态)相关的数据 #表示用户身份的东西
session:保存在服务端上跟用户信息(状态)相关的数据 #服务端用令牌来确认客户
#session的工作需依赖于cookie。目前所有能识别用户身份的网站都需要使用cookie(客户端浏览器也有权拒绝保存cookie)
2.django操作cookie
如果想要让客户端浏览器保存cookie需要HttpResonse对象调用方法
目前用到的视图函数返回HttpResonse对象:
return HttpResponse()
return render()
return redirect()
return JsonRepsonse()
设置cookie需要用一个变量接收该对象:
obj = HttpResponse/render/redirect/JsonRepsonse ()
obj.操作cookie的方法
return obj
1.登录设置cookie
2.多个视图函数都需要校验用户是否登录
装饰器
3.如何记住用户登录之前想要访问的页面 用户登录成功之后自动跳转
场景1:用户访问了其他需要登录才可以访问的页面 如何跳转>>>:想要访问的
场景2:用户直接访问的登录页面 如何跳转>>>:网址首页
'''
print(request.path) #获取路由后缀
print(request.path_info) #获取路由后缀
print(request.get_full_path()) #获取路由后缀+后面所有输入的信息
'''
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
target_path = request.GET.get('next')
if target_path:
obj = redirect(target_path) # 如果有值则跳转到指定页面
else:
obj = redirect('/home/') # 如果没有值则跳转到首页
obj.set_cookie('name', 'jasonNB',max_age=3)#可设置过期时间(3秒后认证取消)
return obj
return render(request, 'login.html')
2.django操作session
请求来之后服务端产生随机字符串并发送给客户端保存 服务端存储随机字符串与用户信息的对应关系 之后客户端携带随机字符串 服务端自动校验
1.django默认的session失效时间14天
2.客户端会接收到键值对 键默认是sessionid 值是加密的随机字符串(令牌)
request.session['name'] = 'jason'
1.django自动产生一个随机字符串返回给客户端(对name加密)
2.往django_session创建数据(对jason加密)
request.session.get('name')
1.自动从请求中回去sessionid对应的随机字符串
2.拿着随机字符串去django_session中匹配数据
3.如果匹配上还会自动解密数据并展示
session的存储位置可以有五种模式
数据库
缓存数据库
文件
缓存+数据库
加密
session其他操作:
# 删除当前会话的所有Session数据(只删客户端的session)
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie(会删除服务端和客户端的session)
request.session.flush()
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在这些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。(默认14天)
二.django中间件
1.中间件简介
中间件就是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
#django中间件类似于django的门户 所有的请求来和响应走都必须经过中间件
#django默认自带"七个"中间件 每个中间件都有各自负责的功能
#django中间件除了默认的之外 还支持自定义中间件(无限)
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',
]
2.django中间件使用场景:(全局相关的功能)
全局用户身份校验、全局用户黑名单校验、全局用户访问频率校验
3.自定义中间件的五个方法
1.process_request(常用)
(1).'请求'来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
(2).该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
2.process_response(常用)
(1).'响应'走的时候会按照配置文件中注册了的中间件 从下往上依次执行每一个中间件里面的process_response方法 如果没有则直接跳过
(2).该方法有两个形参request和response 并且默认情况下应该返回response
(3).该方法也可以自己返回HttpResponse对象
#ps:如果请求的过程中process_request方法直接返回了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)
3.process_view
当路由匹配成功之后 执行视图函数之前 自动触发
4.process_excption
当视图函数报错之后 自动触发
5.process_template_response
当视图函数返回的数据对象中含有render属性对应render函数才会触发
作业
1.基于session编写用户登录功能
2.基于django中间件尝试编写黑名单、白名单功能(url)
RBAC权限管理(后续会讲)
3.巩固本周所学内容!!!