• DAY 56 django11


    1 forms局部和全局钩子的源码
    -is_valid---》self.errors--->self.full_clean()-->
       self._clean_fields() # 字段自己的校验规则和局部钩子执行
       self._clean_form()   # 全局钩子执行
       
    2 cookie,session和token
    3 django中使用cookie
    -HttpResponse的对象.set_cookie(key,value,expire=30)
       -request.COOKIES.get()
       -更新
       -HttpResponse的对象.delete_cookie()
    4 cookie的其他参数
    -过期时间
       -httponly
       -path  /index
       
       
    5 session的使用
    -request.session['name']=lqz(原来有,原来没有)
       -request.session.get('name')
       -del request.session['name']
       
    6 session的其他
    -对象的其他方法
       -配置:过期时间,sessionid
       

    1 cbv加装饰器

    总结:
    1-cbv加装饰器可以加在类上:
       @method_decorator(auth,name='post') #给get请求加装饰器
       2-可以加在方法上
       @method_decorator(auth)
       def get(self, request, *args, **kwargs):
           pass
       
    def auth(func):
       def inner(request,*args, **kwargs):
           #登录校验
           if request.session.get('is_login'):
               res = func(*args, **kwargs)
               return res
           else:
               return redirect('/login')

       return inner


    from django.views import View

    from django.utils.decorators import method_decorator

    # @method_decorator(auth,name='post') #给get请求加装饰器
    class Index(View):
       @method_decorator(auth)
       def get(self, request, *args, **kwargs):
           return HttpResponse('index')

       def post(self, request, *args, **kwargs):
           return HttpResponse('post_index')

    2 正向代理和反向代理

    https://www.cnblogs.com/liuqingzheng/p/10521675.html

    3 中间件介绍和常用内置中间件

    0 中间件:数据库中间件(mycat,分库分表),服务器中间件(tomcat,nginx),消息队列中间件(rabbitmq)
    1 django中间件(Middleware):介于request与response处理之间的一道处理过程,在全局上改变django的输入与输出

    3.1 django在内置中间件

    MIDDLEWARE = [
       # 处理session
       'django.contrib.sessions.middleware.SessionMiddleware',
       # 处理是否带斜杠的
       'django.middleware.common.CommonMiddleware',
       # 跨站请求伪造的处理
       'django.middleware.csrf.CsrfViewMiddleware',
    ]
    # SessionMiddleware源码
    django.contrib.sessions.middleware.SessionMiddleware
    process_request(self, request) # 请求来了
    process_response(self, request, response) # 请求走了会触发

     

    4 自定义中间件

    4.1 process_request(重点)

    1 请求来了触发它,从上往下依次执行(在setting中中间件注册的位置)
    def process_request(self, request):
       如果返回None,就继续往下走
       如果返回四件套之一,直接就回去了
       
    2 在这里面写请求来了的一些判断
    3 request.META.REMOTE_ADDR  #客户端地址
    4 request.META.HTTP_USER_AGENT  # 客户端类型

    4.2 process_response(重点)

    1 请求走了,会触发它,从下往上执行
      def process_response(self, request, response):
           print('请求走了0000')
           return response  #一定要return response
       
    2 在所有的响应中都写入cookie name=lqz
    3 在所有的响应头中都写入 response['x-head']='xxx'

    4.3 process_view(了解)

    Django会在调用视图函数之前调用process_view方法。

    它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果
    def process_view(self, request, view_func, view_args, view_kwargs):
    # view_func 视图函数
    # view_args, 位置参数
    # view_kwargs 关键字参数
    print('我是process view')

    # 如果return None,会执行执行视图函数
    #手动执行了视图函数
    # response=view_func(request,view_args, view_kwargs)
    # 返回response,视图函数就不执行了
    return HttpResponse('ddddd')

     

     

    4.4 process_exception(了解)

    这个方法只有在视图函数中出现异常了才执行
        def process_exception(self, request, exception):
    #记录错误日志
    print(exception)
    print('出错了')

     

    4.5 process_template_response(了解)

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


    def process_template_response(self,request,response):
    print('我执行了')
    return response
    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,'测试')

     

    5 CSRF_TOKEN跨站请求伪造

    https://www.cnblogs.com/liuqingzheng/p/9505044.html

    1 CSRF或者XSRF:跨站请求伪造
    2 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的

    3 防范:CSRF攻击防范
    -Referer:上一次访问的地址(图片防盗链)
    https://www.lagou.com/gongsi/
    -在请求地址中添加 token 并验证
    -在 HTTP 头中自定义属性并验证
    -把随机字符串放在请求体中

     

    6 django中处理csrf

    1 中间件不要注释了
    2 如果是form表单
    <form action="" method="post">
    {% csrf_token %}
    <p>给谁转:<input type="text" name="to_user" id="id_name"></p>
    <p>转多少:<input type="text" name="money" id="id_money"></p>
    <input type="submit" value="转账">

    </form>

    3 如果是ajax提交:两种方案
    $.ajax({
    url: '/transfer/',
    method: 'post',
    //data: {to_user: $('#id_name').val(), money: $('#id_money').val(),csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()},
    data: {to_user: $('#id_name').val(), money: $('#id_money').val(),csrfmiddlewaretoken:'{{csrf_token}}'},
    success: function (data) {
    console.log(data)

    }
    })

    6.1 cookie的处理

    <script src="/static/jquery.cookie.js"></script>

    var token=$.cookie('csrftoken')

    6.2 csrf放到请求头中

     $.ajax({
    url: '',
    headers:{'X-CSRFToken':token},
    type: 'post',
    data: {
    'name': $('[name="name"]').val(),
    'password': $("#pwd").val(),
    },
    success: function (data) {
    console.log(data)
    }

    })

    6.1 全局使用csrf,局部视图函数禁用csrf

    1 在视图函数上加装饰器
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # 不再检测,局部禁用(前提是全站使用)
    # @csrf_exempt
    # 检测,局部使用(前提是全站禁用)
    @csrf_protect
    def csrf_token(request):
  • 相关阅读:
    Linux 查看磁盘读写速度IO使用情况
    Kubernete安装
    jenkins问题解决
    Jenkins用HTTP Request Plugin插件进行网站的监控/加探针(运维监控)
    golang信号signal的处理
    修改docker仓库资源的地址
    centos7修改hostname
    同步CentOS时间
    CentOs查那个目录占空间大
    CentOS7主机名的修改
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14893641.html
Copyright © 2020-2023  润新知