Django中cookie的使用、session的使用、cbv添加装饰器、中间件、csrf介绍

今日学习内容总结

Django中cookie的使用

cookie的增删改查

    1. 增: obj.set_cookie('key', 'value')

    2. 删: obj.delete_cookie('key')

    3. 改: obj.set_cookie('key', 'value')

    4. 查: request.COOKIE.get('key')

增删改查的代码示例

      

def cookie_test(request):
    # obj1 = HttpResponse()
    # return obj1
    # obj2 = render(request,'cookie_test.html')
    # return obj2

    obj = HttpResponse('生成了两个cookie')

    # 设置cookie
    obj.set_cookie('name','shawn')
    obj.set_cookie('pwd','123')

    return obj

      

# 删除cookie
def del_cookie(request):
    obj = HttpResponse('删除了一个cookie')
    obj.delete_cookie('name')
    return obj

      

# 更新cookie,与设置一样
def set_cookie(request):
    obj = HttpResponse('重新对cookie进行了设置')
    obj.set_cookie('name','xing')
    obj.set_cookie('pwd','11122')
    return obj

      

# 获取cookie
def get_cookie(request):
    name = request.COOKIES.get('name')
    pwd = request.COOKIES.get('pwd')
    return HttpResponse(f'获取到cookie,name:{name},pwd:{pwd}')

更多操作

      cookie加盐

# 为cookie进行加盐
def set_salt(request):
    obj = HttpResponse('为name加了个盐中盐')
    obj.set_cookie('name', 'shawn')
    # 加盐操作
    obj.set_signed_cookie('name', 'shawn', salt='盐中盐')
    return obj

# 获取加盐的cookie
def get_salt(request):
    name_salt = request.COOKIES.get('name')
    salts = request.get_signed_cookie('name', salt='盐中盐')
    return HttpResponse(f'获取到加盐的cookie名:{salts}\n加盐后的cookie:{name_salt}')

      设置超时时间, 直接在设置cookie的时候加参数

# expires常用,支持IE浏览器(以秒为单位)
def set_timeout(request):
    obj = HttpResponse('超时删除cookie')
    obj.set_cookie('name', 'shawn', max_age=5)  # 5秒删除
    obj.set_cookie('pwd', '123445', expires=6)  # 6秒删除
    return obj

Django中session的使用

session的增删改查

      

def set_session(request):
    request.session['name'] = 'song'
    request.session['pwd'] = '123'
    return HttpResponse('设置了一个session')

      

# 方式1
def del_session(request):
    name1 = request.session.get('name')
    del request.session['name']  # 删除session中的name信息
    name2 = request.session.get('name')
    pwd = request.session['pwd']
    return HttpResponse(f'只删除name,删除前name:{name1},删除后再获取name:{name2},pwd:{pwd}还在')

# 方式2
def del2_session(request):
    request.session.delete()  # 删除数据库(服务端)
    request.session.flush()  # 删除cookie和数据库(客户端和服务端)
    return HttpResponse('删除,去刷新数据库可以发现空了')

      

def update_session(request):
    name1 = request.session.get('name')
    request.session['name'] = 'shawn'
    name2 = request.session.get('name')
    return HttpResponse(f'修改前{name1},修改后{name2}')

      

def get_session(request):
    name = request.session.get('name')
    pwd = request.session['pwd']  # 两种方法都可以(这种找不到会报错)
    return HttpResponse(f'获取到session:{name}-{pwd}')

session的其他方法

request.session.set_expiry(value)  # 设置超时时间
    1. 如果value是个整数,session会在些秒数后失效。

    2. 如果value是个datatime或timedelta,session就会在这个时间后失效。

    3. 如果value是0,用户关闭浏览器session就会失效。

    4. 如果value是None,session会依赖全局session失效策略。

      针对session数据的存储位置,有五种方案。

  1.数据库存储

  2.缓存存储

  3.文件存储

  4.缓存+数据库存储

  5.动态加密

cbv添加装饰器

      cbv添加装饰器有三种方式添加,需要借助于一个专门的装饰器模块。

    from django.utils.decorators import method_decorator
    # 方式1  直接在类中的某个方法上添加
    class MyLoginView(views.View):
        @method_decorator(login_auth)
        def get(self, request):
            return HttpResponse("from CBV get view")

    # 方式2:直接在类名上添加并指定
    @method_decorator(login_auth, name='get')
    class MyLoginView(views.View):
        def get(self, request):
            return HttpResponse("from CBV get view")

    # 方式3:重写dispatch方法并添加作用于类中所有的方法
    class MyLoginView(views.View):
        @method_decorator(login_auth)
        def dispatch(self, request, *args, **kwargs):
            super().dispatch(request,*args,**kwargs)

Django中间件

中间件简介

      中间件是一个很大的概念, 它介于两个事务之间:

    1. 服务器中间件:服务器的调优,例:Java的Tomcat

    2. 消息队列中间件:消息队列,在应用程序与应用程序之间,
    
    3. 数据库中间件:应用程序与数据库之间

Django中间件简介

    1. 请求来的时候需要先经过中间件才能到真正的Django后端

    2. 响应走的时候也需要经过中间件才能发送出去

    3. 通俗的讲 : 中间件相当于是Django的门户, 你进来时要经过它, 出去的时候也要经过它

    4. 介于request与response处理之间的一道处理过程, 并且在全局上改变django的输入与输出

Django自带的中间件

      Django自带的中间件有七个, 在 setting.py 配置文件中, 每个中间件其实就是一个类,每个都有各自对应的功能。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',  # 处理session
    'django.middleware.common.CommonMiddleware',  # 处理路由匹配是否带斜杠
    'django.middleware.csrf.CsrfViewMiddleware',  # 跨站请求伪造处理
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

中间件的作用

      既然请求来和响应走都经过中间件, 那么我们就可以对所有的请求做一些预处理, 对所有返回的响应也可以做处理。

中间件的主要方法介绍

      可以通过查看Django自带中间件的源码查看他们一般都有什么方法 : (五种)

中间件方法 描述
process_request(self,request)(常用) 所有请求来时都会运行的方法
process_view(self, request, callback, callback_args, callback_kwargs) 所有路由匹配成功之后,跳转执行视图函数之前都会运行该方法
process_exception(self, request, exception) 所有视图中有异常发生时运行的方法
process_response(self, request, response)(常用) 所有返回页面响应时运行的方法
process_template_response(self,request,response) 返回的HttpResponse对象具有render属性时才会触发该方法

      并不是每个中间件都有这五个方法, 只是需要什么方法就有什么方法。

自定义中间件

      中间件的执行顺序

    1. 请求来时,自上而下顺序执行

    2. 响应走时,自下而上顺序执行

      自定义中间件步骤

    1.先在项目名目录或者应用名目录下创建一个任意名字的文件夹(最好见名知意)
    2.在该文件夹下创建任意名字的py文件(最好见名知意)
    3.在该py文件内书写类, 在类中书写中间件的五种方法
        - 类必须继承MiddlewareMixin, 五种方法并不是全都要写,需要几种写几种
    4.将类的路径以字符串的形式注册到settings.py配置文件中的MIDDLEWARE下(与app注册原理类似)

中间件方法的使用

      process_request( ), process_response( )

process_request
    1. 请求来的时候会依此走 MIDDLEWARE 中定义的该方法, 如果中间件没有定义就跳过
        - 执行顺序:  MIDDLEWARE 中从上到下
    2. 如果返回 HttpResponse 对象, 请求将不会继续往后执行, 而是原路返回
        - 目的: 用来做全局相关的所有限制功能
        - 应用: 校验失败不允许访问

process_response
    1. 响应走的时候会依此走 MIDDLEWARE 中定义的该方法, 如果中间件没有定义就跳过
        - 执行顺序:  MIDDLEWARE 中从下到上
    2. 该方法必须返回  HttpResponse 对象
        - 默认返回形参response
        - 返回自定义的

      process_view( ), process_template_response( ), process_exception( )

process_view
    - 路由匹配之前或者执行视图函数之前时触发
    - 执行顺序: MIDDLEWARE 中从上到下
process_template_response
    - 视图函数返回结果中含有render属性是触发
    - 执行顺序: MIDDLEWARE 中从下到上
process_exception
    - 视图函数出现异常时触发
    - 执行顺序: MIDDLEWARE 中从下到上

CSRF跨站请求伪造

CSRF 简介

      CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

      简单理解就是黑客盗用你的身份, 以你的身份来进行一系列操作(发送恶意请求,发消息,购物,转账等等), 这些操作对于服务器来说是完全合法的, 因为你的身份就是一个正常的用户。

csrf 攻击原理示例

      以银行转账为例

      正常用户登入受信任的网站A, 并在本地生成Cookie,在没有登出网站A的情况下(也就是没有清除Cookie), 访问了黑客网站B,B网站中有一个虚假按钮, 背后对应的就是向别人转账, 但用户并不知道, 点击之后会带着用户的Cookie进行转账。

csrf 解决策略

      针对csrf相关的校验有很多种方式,django只是提供了一些而已。

      from表单

<form action="" method="post">
    {% csrf_token %}
    <p>当前账户:<input type="text" name="current_user"></p>
    <p>目标账户:<input type="text" name="target_user"></p>
    <p>转账金额:<input type="text" name="money"></p>
    <input type="submit">
</form>

      ajax请求

1.方式1:页面任意位置先写{% csrf_token %} 之后获取数据         
    'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()

2.方式2:模板语法直接获取
    'csrfmiddlewaretoken':{{ csrf_token }}
posted @ 2022-05-24 21:10  くうはくの白  阅读(56)  评论(0)    收藏  举报