cookie和session
cookie:用来保存状态(保存服务端和客户端交互产生的数据)
当用户登录成功之后,服务端产生一个随机字符串交给客户端保存,在服务端保存数据
随机字符串:用户相关信息
什么是cookie:具体的一段信息,用来存储在浏览器上的键值对,下次访问浏览器时浏览器会自动携带这些键值对,方便服务器提取有用的信息.服务端保存在客服端浏览器上的信息都可以称之为cookie
session:数据是保存在服务端的并且也是键值对的形式
总结:
1.cookie就是保存在客服端浏览器上的信息
2.session是保存在服务端上的信息
cookie操作
虽然cookie是服务端保存给客户端的,但是客户端可以拒绝保存,如果禁止了,那么需要记录用户状态的网页都无法使用了.
视图函数的返回值
return HttpResponse()
return render()
return redirect()
obj = HttpResponse()
操作cookie
return obj
设置cookie
obj.set_cookie(key, value)
获取cookie
request.COOKIES.get(key)
用户在没有登录的情况下想要访问一个需要登录的页面,用个先跳转到登录页面,当用户输入正确的用户名和密码之后,应该跳转到之前用户访问的页面去,而不是写死到某个页面
设置超时时间
obj.set_cookie(key, value, max_age=5)
针对ie浏览器:
obj.set_cookie(key, value, expires=5)
注销cookie
delete_cookie(key)
session操作
sessionid:随机字符串
设置session:
request.session[key] = value
1.django内部会自动生成一个随机字符串
2.django内部自动将速记字符串和对应是数据存储到django_session表中
2.1先在内存中产生操作数据的缓存
2.2在响应结果django中间件的时候才真正的操作数据库
3.将产生的随机字符串返回给浏览器保存
获取session:
request.session.get(‘key’)
1.自动从浏览器请求中获取sessionid对应的随机字符串
2.拿着随机字符串去django_session表中查找对应的数据
3.如果比对上,则将对应的数据取出并以字典的形式封装到request.session中;如果对不上,则获取时返回的是None
django_session表中的数据条数取决于浏览器,同一个计算机上同一个浏览器只会有一条数据生效
session过期时间
request.session.set_expiry()
括号内可以放不同类型的参数:整数(多少秒过期),日期对象(到指定日期失效),0(一旦浏览器关闭就失效),不写(取决于django的默认失效时间)
注销session
request.session.delete()
中间件
1.请求来到时候先经过中间件才能到达django后端
2.响应走的时候经过中间件才能发送出去
自定义中间件是可以自定义的5个方法
必须要的:
1.process_request
请求来的时候需要经过每个中间件里的process_request,结果的顺序就是配置文件中中间件从上到下依次执行;如果中间件没有定义该方法,那么将直接跳过执行下一个中间件;如果该方法返回了HttpResponse对象,那么请求将不再继续往后执行,而是原路返回
2.process_response
响应走的时候需要经过每一个中间件里面的process_response方法,有额外的两个参数request和response;该方法必须返回一个HttpResponse对象,默认返回的就是形参response,也可以自定义返回自己的;顺序是按照配置中注册了的从下往上依次执行,如果没有定义,则直接跳过
了解:
3.process_view
路由匹配成功之后执行视图函数之前,会自动执行的方法,顺序是从上到下
4.process_template_response
只要是response方法,都需要加上response参数.返回的HttpResponse对象有render属性的时候才会触发,顺序是从下往上
(
obj = HttpResponse()
def render():
return HttpResponse()
obj.render = render
return obj
)
5.process_exception
当视图函数出现异常的情况下触发,顺序是从下往上
如何自定义中间件
1.在项目名或者应用名下创建一个任意名称的文件夹
2.在文件夹中创建一个任意名称的py文件
3.在该py文件中书写类(这个类必须继承
MiddlewareMixin),然后在类中可以定义以上5个方法
4.需要将类的路径以字符串的形式注册到settings.py中才能生效