【一】cookie和session
1.什么是Cookie---》京东是经典的cookie登录认证
Cookie就是存储在计算上的小型文本文件,用于记录用户的登陆状态和痕迹
Cookie只能存储少量的数据,并且不会强制进行机密 ---> 可能会导致用户信息泄露
2.什么是session
解决cookie的信息泄露问题,进行加密--》出现了session
流程:客户端从浏览器输入用户名和密码 ---> 带着给服务端 ---> 服务端负责对输入的用户名和密码进行加密---》存入数据库,一个教session的数据库,在下一次登录---》带着你的用户名和密码 还要带着我的 sessionid---》去登录 用户名和密码加密 去数据库差 sessionid 加密串 两者一致登陆成功
3.cookie和session有什么关系
cookie和 session 都是在浏览器首次访问网站的时候分配的标识
# cookie 存储在浏览器本地
# session 存储在服务端的数据库当中的
【二】cookie操作
"""cookie是基于response对象进行操作的"""
obj = redirect(reverse("index"))//三板斧对象
1.设置Cookie信息
obj.set_cookie("sign", "666")
2.设置过期时间为 3 smax_age=3
obj.set_cookie("sign", "666", max_age=3)
# key : 设置 Cookie的 键
# value : 设置 Cookie 的值
# max_age : 过期时间 , 以秒为单位
# expires :过期时间 但是是针对 IE浏览器 以秒为单位
# domain : 域名
# path : 路径
# secure : 安全组策略
# httponly : 只限制于 HTTP 请求
3.获取cookie信息基于键值获取
request.COOKIES.get("sign")
""" 注意在后端获取cookies是不用解密的"""
4.清除掉你电脑上刚才签发的Cookie
obj.delete_cookie("sign")
"""
多个同名的Cookie
实际上,在HTTP规范中,多个同名Cookie是不被允许的。如果服务器尝试设置多个同名Cookie,浏览器将只保留最后一个。因此,在Django或任何Web框架中,你不太可能遇到需要处理多个同名Cookie的情况。
不同名的Cookie
对于不同名的Cookie,你可以通过检查request.COOKIES字典中的不同键来访问它们。每个键都对应一个Cookie的名称,而每个值都是Cookie的值。在装饰器中,你可以根据需求检查一个或多个Cookie的值。
"""
【三】Django操作session
"""#使用session 的前提是迁移数据库!!!
在没有数据库前使用会报session表不存在的错
由于Django的session机制是基于唯一session ID的,所以不会有“同名session”的情况
"""
1.设置session,键值对--->基于resquest
request.session["sign"] = "6666"
2.先获取到 登陆设置进去的 Cookie 信息
request.session.get("sign")
3.设置过期时间
参数类型一:数字:到指定 s 数过后过期
request.session.set_expiry(3)
参数类型二:数字 0 完全关闭浏览器后自动将 session删除
request.session.set_expiry(0)
参数类型三:时间对象:到指定时间点自动删除
4.清除掉刚才签发的 session
request.session.delete()
5.session 全部删除
request.session.flush()
"""
注意:
通过Django的session 操作Django_session 表自动查找到指定的 字符 去核对---》不用进行解密---》直接能获取
session_id 不对 ---> 自动清除掉你浏览器上的 session 信息 --> 想看到登陆后的页面就必须 重新签发
"""
【四】CBV添加装饰器的三种方式
'''需要借助于一个专门的装饰器模块'''
from django.utils.decorators import method_decorator
# 方案二:放到类上面
# @method_decorator(timer, name="get")
class RegisterView(View):
# 方案一 : 放到指定的函数上面
# @method_decorator(timer)
def get(self, request):
print(request.path)
print(request)
int("a")
time.sleep(3)
return render(request, "register.html", locals())
# 方案三:类视图 ---> as_view() ---> 里面的 view() ---> self.dispatch()
# 因为每一个触发的类视图函数都会走 dispatch 相当于给所有人添加一个装饰器
@method_decorator(timer)
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
【五】django中间件
# 回忆django请求生命周期流程图
是django的门户 自带七个中间件 每个都有各自对应的功能
django不单有七个中间件并且每个都有很多功能和方法,除此之外django还支持自定义中间件并提供五个可以自定义的方法
process_request
process_response
process_view
process_template_response
process_excepton
django中间件的使用场景:只要是全局相关的功能都可以在中间件中编写---》就是保安进行安检
eg:用户黑名单校验、用户访问频率校验、网站全局用户身份校验
【六】自定义中间件(超级重要)
"""
1.创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件--->执行视图函数之前会触发
3.在该py文件内编写中间件类
4.配置文件中注册
"""
#看别的中间件都有继承一个MiddlewareMixin所以我们也
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
# 自己写一个关于中间件的类
class MyMiddle1(MiddlewareMixin):
# 五个可以自定义的方法
def process_request(self,request):
print("来自middle1的process_request")
# return HttpResponse("XIXIXIXXIXI")
def process_response(self,request,response):
print("来自middle1的process_response")
return response
# 去setting中去使用
# 必须要掌握的方法
1.process_request
请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法 如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据
2.process_response
响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法 如果没有则直接跳过
"""
来自middle1的process_request
来自middle2的process_request
这里是视图函数:ab
来自middle2的process_response
来自middle1的process_response
"""
如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据 而不再是视图函数想要返回给客户端的数据---->中途拦截了
"""如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个process_response"""原路返回了
(2)需要了解的
1.process_view
路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
2.process_template_response几乎不用
视图函数执行完毕之后返回的对象中含有render属性对应一个render方法
则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
3.process_exception
视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception