cookie和session django中间件

目录

  • 一、cookie和session

    • 1. 为什么要有cookie和session
  • 二、cookie
    • 1. 什么是cookie
    • 2. django中关于cookie的使用
      • (1)后端设置cookie
      • (2)后端获取cookie
      • (3)设置cookie的超时时间
      • (4)删除cookie
  • 三、session
    • 1. 什么是session
    • 2. django中关于session的使用
      • (1) 设置session
    • (2)获取session
    • (3)设置失效时间
    • (4)删除session
  • 四、token
  • 五、django中间件
    • 1. 数据通过django中间件的流程

      • (1)正常流程
      • (2)特殊情况
    • 2. django中间件中常用的方法
      • (1)process_request
      • (2)process_response
      • (3)process_view
      • (4)process_template_response
      • (5)process_exception
    • 3. 自定义中间件
      • (1)自定义中间件的步骤
      • (2)自定义django中间件实例

一、cookie和session

1. 为什么要有cookie和session

  • 目的是为了保存客户端的用户状态
  • http协议是无状态的

二、cookie

1. 什么是cookie

  • 简单来说,cookie就是保存在客户端浏览器上的键值对
  • 浏览器中保存的cookie即这些键值对是由服务端设置的,再保存到客户端浏览器上。浏览器有权禁止cookie的写入(就是浏览器不保存cookie)

2. django中关于cookie的使用

(1)后端设置cookie

  • 之前在django后端的视图层中,视图函数最后返回的都是HttpResponse对象,但现在,我们操作cookie,则需要使用HttpResponse对象来设置cookie
  • 通过HttpResponse对象.set_cookie(‘key‘,‘value‘)语句来设置cookie
  • 实例:在登陆成功时设置cookie
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            # 登录成功
            old_path = request.GET.get('next')  # 登陆成功后要跳转的url(使用登陆认证装饰器在登陆的url后面携带get请求参数——》 ?next=url)
            if old_path:  # 防止用户直接访问的login页面
                obj = redirect(old_path)
            else:
                obj = redirect('/home/')  # 默认跳转到首页 当用户没有想要访问的网址
            obj.set_cookie('whoami','jason')  # 告诉浏览器保存一个键值对
            return obj
    return render(request,'login.html')

(2)后端获取cookie

  • 通过request.COOKIES语句来获取cookie
  • 实例:设计登陆认证装饰器
from functools import wraps
def login_auth(func):
    @wraps(func)  # wraps作用是 修复被装饰的函数
    def inner(request,*args,**kwargs):
        # 判断当前用户是否登录
        # print('request.path_info:',request.path_info)  # 只获取url
        # print('request.get_full_path():',request.get_full_path())  # url+get请求的参数
        if request.COOKIES.get('whoami'):
            res = func(request,*args,**kwargs)
            return res
        else:
            target_path = request.path_info
            return redirect('/login/?next=%s'%target_path)
    return inner

(3)设置cookie的超时时间

  • cookie的超时时间是指该cookie在浏览器上能够保存的时间,从该cookie在浏览器上出现开始计算。
  • 设置语法:
    • HttpResponse对象.set_cookie(‘key‘,‘value‘,max_age=n)
    • HttpResponse对象.set_cookie(‘key‘,‘value‘,expires=n)
      • 最后的一个参数都是设置超时时间,并且都是以秒为单位
      • 区别:如果你要给IE浏览器设置cookie的超时时间,你只能用expires

(4)删除cookie

  • 删除cookie会让浏览器立马清楚其保存的响应的键值对
  • 删除语法:HttpResponse对象.delete_cookie(key)
  • 实例:登出/注销功能
@login_auth
def logout(request):
    obj = redirect('/home/')
    obj.delete_cookie('whoami')
    return obj

三、session

1. 什么是session

  • session是保存在服务端上的键值对,在客户端的cookie中也保留一个session的键。
  • session的工作机制需要依赖于cookie
    • 客户端浏览器上的cookies的其中之一的一个键值对是sessionid:session的键生产的随机字符串
  • session的键其实是世界上唯一的一个字符串,值是我们自定义的一些数据。虽然在我们设置session时,自己给出了一个任意的字符串当做session的key,但是django后端会自动将该key转变成一个世界上唯一的字符串,并且还将这个key对应的值进行加密,最后默认保存在数据库django_session表中(当然也可以通过修改一些设置,让session保存在其他本地文本文件中或内存中)。

2. django中关于session的使用

(1) 设置session

  • 设置session语法:request.session[key] = value

    • 第一次设置的时候可能会报错,是因为你没有执行数据库迁移命令生成django需要用到的一些默认表(django_session)
  • django默认的session失效时间是14天
  • 当执行request.session[key] = value这句语句时发生的事:
    1. djang内部自动帮你调用算法生成一个随机的字符串作为session的key,并把该key对应的值进行加密
    2. 在django_session表中添加数据(数据保存方式: 随机字符串 加密后的数据 失效时间)
    3. 将产生的随机字符串返回给客户端浏览器 让浏览器保存
  • 注意:一个项目中,其数据库的django_session表中,无论有多少个session,通过同一种浏览器设置的session只会保存在一行记录中。不同浏览器设置的session才会保存在不同的行中。

(2)获取session

  • 语法:request.session.get(key)key是我们之前设置session时,指定的key,不是生成的那个随机字符串。
  • 当执行request.session.get(key)时发生的事:
    1. django内部会自动去请求头里面获取cookie
    2. 拿着sessionid所对应的随机字符串去django_sessoion表中一一比对
    3. 如果比对上了,会将随机字符串对应的数据获取出来,自动放入request.session中供程序员调用,如果没有就是一个空字典

(3)设置失效时间

  • 语法:request.session.set_expiry(value)

    • 如果value是个整数,session会在些秒数后失效。
    • 如果value是个datatime或timedelta,session就会在这个时间后失效。
    • 如果value是0,用户关闭浏览器session就会失效。
    • 如果value是None,session会依赖全局session失效策略。
  • 失效时间是指到了这个时间,保存在服务端的django_session表中的这个session数据就没用了。之后会被删除。且客户端浏览器上的sessionid的这个cookie也会失效。

(4)删除session

  • 语法:

    • request.session.delete()

      • 客户端和服务端的关于session的会全部删除,数据库中只会根据浏览器的不同删对应的数据
    • request.session.flush()
      • 建议使用这个

四、token

五、django中间件

  • django中间件的作用非常强大,请求数据到后端要经过中间件,视图函数响应的数据(return返回的数据)也要经过中间件。
  • 数据在通过中间件时,中间件都有各自独立的功能,在特定情况下对数据做相应的处理。
  • django默认有七个中间件
  • django支持自定义中间件
  • django中间件的作用
    1. 全局的用户登录校验
    2. 全局的用户访问频率校验
    3. 全局的用户权限校验()

1. 数据通过django中间件的流程

(1)正常流程

  • 请求数据到django后端的django中间件后,按照从上到下的顺序依次通过settings文件中MIDDLEWARE中书写的各个中间件——》
  • 数据到视图层,视图层再返回响应数据——》
  • 响应数据再按照从下到上的顺序依次通过settings文件中MIDDLEWARE中书写的各个中间件。

(2)特殊情况

  • 当中间件中的process_request方法返回了一个HttpResponse对象,那么请求会立刻停止往后面走(下面的中间件和之后的视图函数都不走),立即原路返回

2. django中间件中常用的方法

  • django各个中间件中一般都含有一个process_requestprocess_response 方法
  • 这些方法都含有request形参,放在self之后
  • 如果形参中含有response 那么必须要返回,若返回其他,则响应数据就会变成其他。

(1)process_request

  • 请求来的时候会按照settings配置文件中从上往下的顺序,依次执行每一个中间件内部定义的process_request方法
  • 当请求数据走到中间件时,会执行该方法。若该中间件没有该方法,则会跳过该中间件继续走下一个中间件
  • 该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走,立即原路返回(当process_request方法直接返回HttpResponse对象之后,会直接从当前中间件里面的process_respone往回走)
  • 方法参数:
    def process_request(self,request):

(2)process_response

  • 视图函数返回的响应数据走的时候,会按照settings配置文件中从下往上的顺序,依次执行每一个中间件内部定义的process_response方法
  • 该方法必须有两个形参request,response,并且必须返回response形参,不返回直接报错
  • 该方法返回什么(HttpResponsed对象) 前端就能获得什么,即该方法返回的数据会覆盖掉之前视图函数返回的响应数据。并且若该中间件上面的中间件的process_response方法也返回了HttpResponsed对象,则会再把该中间件的返回数据再覆盖掉。
  • 方法参数:
    def process_response(self,request,response):

(3)process_view

  • 路由匹配成功之后执行视图函数之前触发该方法
  • 如果该方法返回了HttpResponse对象 那么会从下往上一次经过每一个中间件里面的process_response方法
  • 方法参数:
    def process_view(self,request,view_name,*args,**kwargs):
    
    # view_name 是要执行的视图函数的内存地址  

(4)process_template_response

  • 当你返回的对象中含有render属性指向的是一个render方法的时候才会触发,从下往上的顺序
  • 方法参数:
    def process_template_response(self, request, response):
  • 实例
# 让后端视图函数中返回的对象含有render属性的方式
def mdzz(request):
    print('我是视图函数mdzz')
    def render():
        return HttpResponse('你好呀 我是奇葩')
    obj = HttpResponse('我很好 好的像个傻逼一样')
    obj.render = render
    return obj

# 响应数据变成了: 我是视图函数mdzz

(5)process_exception

  • 当视图函数中出现错误,会自动触发,顺序是从下往上
  • 方法参数:
    def process_exception(self, request, exception):

3. 自定义中间件

  • 注意:django暴露给用户五个可以自定义的方法(就是上面提到的5个django中间件常用的方法)来自定义中间件

(1)自定义中间件的步骤

  1. 在应用文件下(如:app01)新建一个任意名字的文件夹(如:mymddleware)
  2. 在mymddleware文件下新建一个任意名字的py文件(如:mymdd.py)
  3. 导入方法
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse,render,redirect
  4. 在mymdd文件中自定义类,一个类就是一个中间件。类内部写上面提到的5个django中间件中常用的方法
  5. 在settings文件的MIDDLEWARE变量值中添加自定义的中间件路径
    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',
        'app01.mymiddleware.mymdd.MyMdd1',  # 添加自定义中间件
        'app01.mymiddleware.mymdd.MyMdd2',  # 添加自定义中间件
    ]

(2)自定义django中间件实例

class MyMdd1(MiddlewareMixin):
    def process_request(self,request):
        print('我是第一个中间件里面的process_request方法')
        # return HttpResponse("我是中间件一里面的")

    def process_response(self,request,response):
        """
        :param request:
        :param response: 就是后端返回给前端的数据
        :return:
        """
        print('我是第一个中间件里面的process_response方法')
        return response
        # return HttpResponse("我是中间件一里面的")

    def process_view(self,request,view_name,*args,**kwargs):
        print(view_name)
        print(args)
        print(kwargs)
        print('我是第一个中间件里面的process_view方法')
        # return HttpResponse("我是中间件一里面的process_view")

    def process_exception(self,request,exception):
        print('我是第一个中间件里面的process_exception')
        print(exception)

    def process_template_response(self, request, response):
        print('我是第一个中间件里面的奇葩方法')
        return response

class MyMdd2(MiddlewareMixin):
    def process_request(self,request):
        print('我是第二个中间件里面的process_request方法')
        # return HttpResponse('我是中间件二里面的')

    def process_response(self,request,response):
        """
        :param request:
        :param response: 就是后端返回给前端的数据
        :return:
        """
        print('我是第二个中间件里面的process_response方法')
        return response

        # return HttpResponse("我是中间件二里面的")
    def process_view(self,request,view_name,*args,**kwargs):
        print(view_name)
        print(args)
        print(kwargs)
        print('我是第二个中间件里面的process_view方法')
        # return HttpResponse("我是中间件二里面的process_view")

    def process_exception(self, request, exception):
        print('我是第二个中间件里面的process_exception')
        print(exception)

    def process_template_response(self, request, response):
        print('我是第二个中间件里面的奇葩方法')
        return response    

原文地址:https://www.cnblogs.com/Mcoming/p/11985672.html

时间: 2024-11-14 01:16:09

cookie和session django中间件的相关文章

Cookie、session、中间件

正文 一  cookie 机制 Web应用程序是使用HTTP协议传输数据的.HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从连接上跟踪会话.即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了.Cookie可以弥补HTTP协议无状态的不足.在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话.cookie有如下特点: cookie是保

django的cookie和session以及内置信号、缓存

cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览器客户端的,而session是存放在服务器端的 cookie的基本操作 cookie增删改查操作 1.设置Cookies response.set_cookie("cookie_key","value") 2.获取Cookies value = request.COOK

django之form组件、cookie、session

django之form组件.cookie.session django form组件 1.渲染标签 2.校验数据 3.展示信息 校验数据 # 第一步需要一个form类 from django import forms class MyForm(forms.Form): name = forms.CharField(max_length=8) password = forms.CharField(max_length=8,min_length=3) email = forms.EmailField

Django进阶(路由系统、中间件、缓存、Cookie和Session

路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage), url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}), 2.根据app对路由规则进行一次分类 rl(r'^web/',include('web.urls')), 1.每个路由规则对应

Django之Cookie、Session、CSRF

Cookie 1.获取Cookie: 1 2 3 4 5 6 request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)     参数:         default: 默认值            salt: 加密盐         max_age: 后台控制过期时间 2.设置Cookie: 1 2 3 4 5 6 7 8 9 10 11 12 13 rep

Django的Form、CSRF、cookie和session

Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和减少后台服务器的压力,通常我们在前端会对form表单进行数据合法性验证,但即使这样,后台的数据验证依然是必须不可省略的,原因很简单前端数据可以被伪造或js直接被禁用. Django内置了一个强大的Form功能,帮我们快速自定义后台数据验证,它的形式非常类似model类的定义方法,并且两者也具有内在联

Django之Form、CSRF、cookie和session

Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和减少后台服务器的压力,通常我们在前端会对form表单进行数据合法性验证,但即使这样,后台的数据验证依然是必须不可省略的,原因很简单前端数据可以被伪造或js直接被禁用. Django内置了一个强大的Form功能,帮我们快速自定义后台数据验证,它的形式非常类似model类的定义方法,并且两者也具有内在联

Cookie、Session和Django分页

cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况. 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的. 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留.会话中产生的数据又是我们需要保存的,也就是说要“保持状态”.因此cookie就是在这样一个场景下诞生.

Django中cookie和session

cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况. 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的. 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留.会话中产生的数据又是我们需要保存的,也就是说要"保持状态".因此cookie就是在这样一个场景