cookie与 session

一、cookie and session

HTTP协议是无状态的 也就是说 你每一次访问浏览器的话 浏览器是不认识你的 每一次访问都是独立的 ,浏览器是‘你虐他千百遍’ 转眼之间"他待你如初恋",他是不会受到前面请求响应情况直接影响,也不会直接影响后面的请求响应的情况,每一次请求都是全新的,对于状态这一词可以理解为 客户端和服务端在某次回话中产生的数据,那么无状态就是这些数据不会保存。但是有些会话的数据我们又是需要保存的,也就是要 "保持状态",因此Cookie就是这样诞生的

cookie具体指的就是一段小信息,他是服务器发出来储存在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便于服务器提取有用的信息

其工作原理:有服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上Cookie,这样子服务器可以通过cookie中的内容来判断这是 "谁"

设置cookie

obj = HttpResponse()

obj.set_cookie()


获取cookie

#第一种
request.COOKIES['key']    #不推荐使用
#第二章
request.COOKIE.get()

删除cookie

def logout(request):
    rep = rediect('/login/')
    rep.delete_cookie('user')
    return rep

cookie版 登陆校验

from functools import wraps
def check_login(func):
    @wraps(func)
    def inner(request,*args,**kwargs):

        if request.COOKIES.get('username'):
            return func(request,*args,**kwargs)
        else:
            next_url = request.path_info
            return redirect('/login/?next=%s'%next_url)
    return inner


def login(request):
    if request.method == "GET":
        return render(request,'login.html')
    if request.method== "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username =='luodaoqi' and password =='123':
            old_path = request.GET.get('next') 
            if old_path:
                obj = redirect(old_path)
            else:
                obj = redirect('/index/')
            obj.set_cookie('username','password')
            return obj
    return render(request,'login.html')

二、session

cookie 虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新东西,他能支持更多的字节,并且他保存在服务器,有较高的安全性。

这就是session

获取session

#第一种
request.session['key']
#第二种
request.session.get('key',None)
'''
1.django内部自动生成了随机的字符串
2.在django_session表中存入数据
session_key          session_data         date
随机字符串1              数据1            ...
随机字符串2              数据2            ...
随机字符串3              数据3            ...
3.将产生的随机字符串发送给浏览器 让浏览器保存到cookie中
sessionid:随机字符串
	

'''

设置session

request.session['key']=xxx
request.session.setdefault('key',xxx)#存在就不设置

'''
1.浏览器发送cookie到django后段之后 django会自动获取到cookie值
2.拿着随机字符串去django session表中比对 是否有对应的数据
3.如果比对上了 就讲随机字符串所对应的数据 去除赋值给request.session
	如果比对不上 那么request.session就是 空
'''
#django session表对于同一个浏览器只会有一条记录  不同的有多个记录

删除session

request.session.delete() #只会删除服务端的session
request.session.flush() #浏览器 和服务端的全部删除

设置session 超时时间

request.session.set_expiry(value多种配置)
数字
0
不写
时间格式

Django中间件(*****)

​ 用户访问频率限制

​ 用户是否黑名单 白名单

​ 所有用户登陆校验

​ 只要涉及到网址全局的功能 你就应该考虑使用中间件

django中间件暴露呗程序员五个可以自定义的方法(五个方法都是在特定条件下触发的)

  1. 新建一个文件夹 里面新建一个任意名称的PY文件

    里面写类 固定继承

    from django.utils.deprecation import MiddlewareMixin
    class MyMiddle(MiddlewareMixin):

    2.去配置文件注册到中间件配置中
    你需要手写字符串的路径
    'app01.mymiddleware.myaabb.MyMiddle1'

跨站请求伪造(csrf) 钓鱼网站
就类似于你搭建了一个跟银行一模一样的web页面
用户在你的网站转账的时候输入用户名 密码 对方账户
银行里面的钱确实少了 但是发现收款人变了

    最简单的原理
        你写的form表单中 用户的用户名  密码都会真实的提交给银行后台
        但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框
        你自己提前写好了一个隐藏的带有name和value的input框

解决钓鱼网站的策略
    只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串
    当用户提交post请求的时候  我会自动先取查找是否有该随机字符串 
    如果有 正常提交
    如果没有  直接报403 
 form表单
        你在写的时候只需要加上一个
        {% csrf_token %}

    ajax
        第一种  自己再页面上先通过{% csrf_token %}获取到随机字符串  然后利用标签查找 
        data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
        第二种
        data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
        第三种
        拷贝js文件


装饰器
    csrf_exempt  只有两种装饰的方式
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    from django.utils.decorators import method_decorator
    # 第一种
    # @method_decorator(csrf_exempt,name='dispatch')
    class MyCsrf(View):
        # 第二种
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request,*args,**kwargs)
        def get(self,request):
            return HttpResponse('hahaha')
            
    除了csrf_exempt之外 所有的其他装饰器 在CBV上面都有三种方式
    @method_decorator(csrf_protect,name='post')
    class MyCsrf(View):
        @method_decorator(csrf_protect)
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request,*args,**kwargs)
        def get(self,request):
            return HttpResponse('hahaha')

        @method_decorator(csrf_protect)
        def post(self,request):
            return HttpResponse('post')
posted @ 2019-10-30 21:55  Daoqi  阅读(92)  评论(0编辑  收藏  举报