django中间件
# 1.所有的请求和响应都必须经过中间件
# 2.django中间件默认自带七个,每个中间件负责不同的功能
"""Django中间件的作用"""
-1.修改请求,即传送到view中的HttpRequest对象。
-2.修改响应,即view返回的HttpResponse对象。
# 3.中间件的配置:
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',
# 4.常见的中间件方法(五个)
# 1).process_request
- 1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
- 2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
# 2).process_response
- 1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
- 2.该方法有两个形参request和response 并且默认情况下应该返回response
- 3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
"""
注意:如果请求的过程中process_request方法直接反悔了
HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)
"""
# 3).process_view
当路由匹配成功之后 执行视图函数之前 自动触发
# 4).process_excption
当视图函数报错之后 自动触发
# 5).process_template_response
当视图函数返回的数据对象中含有render属性对应render函数才会触发
# 5.自定义中间件
- 1. 创建一个任意名的文件夹
- 2. 文件夹内创建一个任意名的py文件
- 3. 在py文件内编写中间件类(参考自带中间件的代码编写类并继承)
- 4. 在配置文件中注册即可(注册后才可以生效)
cookie与session简介
# 1.cookie
保存在客户端与用户状态相关的信息
# 2.session
保存在服务端与用户状态相关的信息
"""session的工作需要依赖于cookie"""
# 3.浏览器有资格拒绝保存服务端发送过来的cookie数据
# 4.django操作cookie
- 1.想让客户端浏览器保存cookie需要HttpResponse对象调用方法
from django.shortcuts import render,HttpResponse,redirect,JsonResponse
return render()
return HttpResponse()
return redirect()
return JsonRepsonse()
- 2.设置cookie
obj = HttpResponse()/render()/redirect()/JsonResponse()
obj.操作cookie的方法
return obj
- 3.cookie操作设置
1.登录设置cookie
2.多个视图函数都需要校验用户是否登录(装饰器)
3.记录住用户登录之前想要访问的页面,登录成功后自动跳转
场景1:用户访问了其他需要登录才可以访问的页面 如何跳转>>>:想要访问的
场景2:用户直接访问的登录页面 如何跳转>>>:网址首页
print(request.path)
print(request.path_info)
print(request.get_full_path())
# 5.django操作session
-1.session类似于服务端接收到客户端产生的随机字符串,存储后每次自动校验
-2.session的特点:
1.django默认的session失效时间是14天
2.客户端会接收到键值对,键默认是sessionid的值是加密的随机字符串(令牌)
3.session用于存储一次会话的多次请求的数据,存在服务端
4.session可以存储任意类型,任意大小的数据
5.即使浏览器关闭,保存的session也不会改变
6.session是以键值对的形式存储的
7.session依赖于cookie;唯一标识码保存在sessionid cookie
-3.session操作
request.session['name'] = 'jason'
1.django自动产生一个随机字符串返回给客户端(对name加密)
2.往django_session创建数据(对jason加密)
request.session.get('name')
1.自动从请求中回去session对应的随机字符串
2.拿着随机字符串去django_session中匹配数据
3.匹配到会自动解密并且展示
-4.session的存储位置(五种模式)
1.数据库
2.缓存数据库
3.文件
4.缓存+数据库
5.加密
-5.session其他操作
1.删除
# 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
2.时间设置
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
"""
1.如果value是一个int类型,那么session将在value这个时间后过期,其中value代表的是秒。
2.如果value是一个datetime或者timedelta对象,那么这个session将在指定的时间后过期。datetime必须是使用了PickleSerializer进行序列化的。
3.如果value等于0,那么session将在web浏览器关闭后就直接过期。
4.如果value等于None,那么session将用settings.py中设置的全局过期字段SESSION_COOKIE_AGE,这个字段默认是14天,也就是2个礼拜。
5.读session的时候不会修改session的有效期,修改session的时候会重新设置session的有效期,会从修改的时间,重新计时。
6.如果settings.py中设置了SESSION_EXPIRE_AT_BROWSER_CLOSE=True,那么默认讲不再使用SESSION_COOKIE_AGE了,而是浏览器一关闭,session数据就会过期。这个值默认是为False。
"""