zoukankan      html  css  js  c++  java
  • day79

    昨日回顾

    昨日回顾:
        cookie:
            -是什么?存储在客户端浏览器上的键值对
            -干啥用的?记录状态
            -django中使用:
                -设置值:
                    -HttpResponse对象,obj.set_cookie(key,value,超时时间)
                    -JsonResponse也可以用
                -取值
                    request.COOKIES  字典,然后把要取的值取出来,推荐用get
                -删除值
                    -HttpResponse对象,obj.delete_cookie('key'),从客户浏览器中删除
            -其他一些属性:
                -加盐的cookie
                -超时时间
                -路径:如果是根路径,说明,以后所有的请求,都会携带cookie过来
                -域:在某个域下有效
        session:
            -是什么?存在服务器上的键值对:key是一个随机字符串,value是个字典
            -有什么作用:安全性,客户端浏览器不再存储敏感信息
            -django中使用:
                -设置值
                    -request.session['name']=lqz
                    -1 生成一个随机字符串
                    -2 存到数据库 随机字符串     {'name':lqz}
                    -3 向cookie中写入:sessionid  随机字符串
                    
                    -如果:再设置一次值
                        request.session['age']=18
                        只在随机字符串对应的字典内部添加,{'name':lqz,'age':18}
                -取值
                    -request.session.get('name')
                    -先取出cooki中的随机字符串
                    -取数据库根据随机字符串查询,拿到data的值
                    -从字典中取出name对应的值
                    
                -删除值
                    -request.session.delete()------>只是删除数据库的内容
                    -request.session.flush()------>删除数据库的内容,又删除浏览器的cookie
                    
                -其他的属性:
                    -默认session存在数据库,可以存在缓存,文件
                    -超时时间
                    -路径:如果是根路径,说明,以后所有的请求,都会携带cookie过来
                    -域:在某个域下有效
                    -其他的
    View Code

    今日内容

      1.什么是中间件?

        中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能

        作用:可以控制请求和响应

        django中内置有几个中间件

        自定义一个中间件

    # 自定义中间件
    class FirstMyMid(MiddlewareMixin):
        # 请求过来时,中间响应的方法
        def process_request(self, request):
            print('----' * 50)
            print('this is request')
            # 如果 return 一个HttpResponse那么将直接从这个中间件开始往浏览器端返回(跳过后面所有的过程)
            # 如果 return 一个None那么将会往下一个中间件继续传递。
            # return HttpResponse('Is MyMid')
            # return 'asd' #出错,源码判断 is Not None 就返回 response
    
        # 请求回去时,中间响应的方法
        def process_response(self, request, response):
            print('----' * 50)
            print('this is response')
            return response
    
        # 经过路由控制来到process_view 可以获取到本次请求的视图函数地址
        def process_view(self, request, view_func, view_args, view_kwargs):
            print('----' * 50)
            # res = view_func(request)
            print('view_func:', view_func)
            print('view_args:', view_args)
            print('view_kwargs', view_kwargs)
    
        # 一旦视图函数报错这里的exception可以接收到错误信息(执行完视图函数之后才会执行该函数)
        def process_exception(self, request, exception):
            return HttpResponse(exception)
    View Code
    定义过程:
        1.-from django.utils.deprecation import MiddlewareMixin   先导入
        2.-定义一个类,随意命名,继承MiddlewareMixin
        def process_request(self, request):(-请求来的时候,会响应它)
        def process_response(self, request, response):(-响应回去的时候,会走它)
        3.在在setting中注册,是有顺序的
    	MIDDLEWARE = [
    				'app01.mymiddelware.MyMiddleware1',
    				]
    

        

      def process_view(self, request, view_func, view_args, view_kwargs):

      当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。

        -def process_exception(self, request, exception)

        

        -def process_template_response(self, request, response):

          该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法

    class Test:
        def __init__(self,status,msg):
            self.status=status
            self.msg=msg
        def render(self):
            import json
            dic={'status':self.status,'msg':self.msg}
    
            return HttpResponse(json.dumps(dic))
    def index(response):
        return Test(True,'测试')
    

      csrf:跨站请求伪造 
          比如:转账请求:transfer?to=lqz&count=1000
          -是什么?攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的
          -如何防范:
             -通过refer
             -加一个随机字符串校验(加载请求的路径里,加载请求体中)
             -在请求头中加字符串校验
      django中的应用:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
        <script src="/static/jquery-3.3.1.js"></script>
    </head>
    <body>
    <form action="" method="post">
        {% csrf_token %}
        <input type="text" name="name">
        <input type="text" name="pwd">
    
    </form>
    <input type="button" value="登陆" id="btn">
    </body>
    <script>
        $('#btn').click(function () {
            $.ajax({
                url: '/index/',
                type: 'post',
                data: {
                    'name': $('[name="name"]').val(),
                    'pwd': $('[name="pwd"]').val(),
                    'csrfmiddlewaretoken': '{{ csrf_token }}',
                    {#'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()#}
                },
                success:function (data) {
                    alert(data)
                }
            })
        })
    </script>
    </html>
    View Code

    导入

    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    from django.views import View
    from django.utils.decorators import method_decorator

    全站禁用:注释掉中间件 'django.middleware.csrf.CsrfViewMiddleware',

    局部禁用:用装饰器(在FBV中使用)

    CBV

    @method_decorator(csrf_exempt, name='dispatch')
    class index(View):
        def get(self, request):
            if request.GET.get('next'):
                return render(request, 'index.html')
            return render(request, 'index.html')
    
        def post(self, request):
            name = request.POST.get('name')
            pwd = request.POST.get('pwd')
            if name == 'yxf' and pwd == '123':
                return HttpResponse('登陆成功')
            return HttpResponse('登陆失败')
  • 相关阅读:
    微服务之初识微服务
    常见的认证机制及JSON WEB TOKEN
    深入理解缓存之缓存预热与淘汰策略
    深入理解缓存之缓存和数据库的一致性
    深入理解缓存之缓存存在的问题及应对措施
    深入理解缓存之常见的缓存算法
    计算机网络之HTTP、HTTPS、HTTP2
    计算机网络之TCP(三次握手、四次挥手等),UDP及DNS
    计算机网络之网络体系架构与IP
    深入理解MyBatis(四)--缓存
  • 原文地址:https://www.cnblogs.com/yaoxiaofeng/p/10009313.html
Copyright © 2011-2022 走看看