9.25总结

django中间件

  django中间件就类似于是django的保安

  请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models)

  响应走的时候也需要经过中间件才能到达web服务网关接口

    django默认的七个中间件
        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',
                    ]

 

  django中间件中有五个用户可以自定义的方法

    django中间件可以用来做什么(******)

      1.网站全局的身份校验,访问频率限制,权限校验...

      只要是设计到全局的校验都可以再中间件中完成

      2.django的中间件是所有web框架中做的最好的

    

    需要我们掌握的方法有

      1.process_request()方法

        规律

          1.请求来的时候会经过每个中间件里面process_request方法(从上往下)

          2.如果方法里面直接返回了HttpRespon对象,那么会直接返回,不再往下执行

            基于该特点就可以做访问频率限制,身份校验,权限校验

 

      2.process_response()方法

        规律

          1.必须将response形参返回,因为这个形参指代的就是要返回给前端的数据

          2.响应走的时候,会一次经过每一个中间件里面的process_response方法(从下往上)

    

    需要了解的方法

      3.process_view()

        在路由匹配成功执行视图函数之前触发

      4.process_exception()

        当你的视图函数报错时,就会自动执行

      5.process_template_response()

        当你返回的HttpRespon对象中必须包含render属性才会触发

        def index(request):

          print('我是index视图函数')

          def render():

            return HttpResponse('aaa')

          obj = HttpResponse('index')

          obj.render = render

          return obj

  总结:在书写中间件的是时候,只要形参中有response,你就顺手将其返回,这response就是要给前端的消息

 

  如何自定义我们自己的中间件

    1.如果想让你写的中间件生效,就必须要先继承MiddlewareMixin

    2.在注册自定义中间件的时候,一定要确保路径不要写错

          

csrf跨站请求伪造

  钓鱼网站

  通过制作一个跟正常网站一模一样的页面,片区用户输入信息,转账交易,从而做手脚

    转账交易的请求确实是发给了银行,账户的钱也确实少了

    唯一不一样的地方在于收款人账户不对

  内部原理

    在让用户输入对方账户的那个input上面做手脚

    给这个input不设置name属性,在内部隐藏一个事先写好的name和value属性的input框

    这个value的值,就是钓鱼网站受益人的账号

  防止钓鱼网站的思路

    网站会给返回给用户的form表单页面,偷偷塞一个随机字符串

    请求到来的时候,会先比对随机字符串是否一致,如果不一致,直接拒绝(403)

  该随机字符串有一下特点

    1.同一个浏览器每一次访问都不一样

    2.不同浏览器绝对不会重复

 

1.form表单发送post请求的时候,需要你做的仅仅书写一句话

  {% csrf_token %}

 

2.ajax发送post请求,如何避免csrf校验

    1.先在页面上写{% csrf_token %},利用标签查找  获取到该input键值信息
        {'username':'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()}
        $('[name=csrfmiddlewaretoken]').val()
        
    2.直接书写'{{ csrf_token }}'
        {'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}
        {{ csrf_token }}
    
    3.你可以将该获取随机键值对的方法 写到一个js文件中,之后只需要导入该文件即可
        新建一个js文件 存放以下代码 之后导入即可 
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
        var csrftoken = getCookie('csrftoken');


        function csrfSafeMethod(method) {
          // these HTTP methods do not require CSRF protection
          return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }

        $.ajaxSetup({
          beforeSend: function (xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
              xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
          }
        });

 

1.当你网站全局都需要校验csrf的时候,有几个不需要校验该如何处理

2.当你网站全局不校验csrf的时候,有几个需要校验又该如何处理

    from django.utils.decorators import method_decorator    
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # 这两个装饰器在给CBV装饰的时候 有一定的区别
    如果是csrf_protect 那么有三种方式
        # 第一种方式
        # @method_decorator(csrf_protect,name='post')  # 有效的
        class MyView(View):
            # 第三种方式
            # @method_decorator(csrf_protect)
            def dispatch(self, request, *args, **kwargs):
                res = super().dispatch(request, *args, **kwargs)
                return res

            def get(self,request):
                return HttpResponse('get')
            # 第二种方式
            # @method_decorator(csrf_protect)  # 有效的
            def post(self,request):
                return HttpResponse('post')
            
    如果是csrf_exempt 只有两种(只能给dispatch装)   特例
    @method_decorator(csrf_exempt,name='dispatch')  # 第二种可以不校验的方式
    class MyView(View):
        # @method_decorator(csrf_exempt)  # 第一种可以不校验的方式
        def dispatch(self, request, *args, **kwargs):
            res = super().dispatch(request, *args, **kwargs)
            return res

        def get(self,request):
            return HttpResponse('get')

        def post(self,request):
            return HttpResponse('post')

总结:装饰器中只有csrf_exempt是特例,其他的装饰器在给CBV装饰的时候,都可以有三种方式

 

auth模块(用就用全套)

  跟用户相关的功能模块:用户的注册,登录,验证,修改密码...

  执行数据库迁移命令之后,会生成很多表,其中的auth_user是一张用户相关的表格

  添加数据

    createsuperuser  创建超级用户  这个超级用户就可以拥有登录django admin后台管理的权限

 

auth模块的功能

    查询用户
        from django.contrib import auth
        user_obj = auth.authenticate(username=username,password=password)  # 必须要用 因为数据库中的密码字段是密文的 而你获取的用户输入的是明文
    记录用户状态
        auth.login(request,user_obj)  # 将用户状态记录到session中
    判断用户是否登录
        print(request.user.is_authenticated)  # 判断用户是否登录  如果是你们用户会返回False
    用户登录之后 获取用户对象
        print(request.user)  # 如果没有执行auth.login那么拿到的是匿名用户
    校验用户是否登录
        from django.contrib.auth.decorators import  login_required
        @login_required(login_url='/xxx/')  # 局部配置
        def index(request):
            pass
        
        # 全局配置  settings文件中
        LOGIN_URL = '/xxx/'
    验证密码是否正确
        request.user.check_password(old_password)
    修改密码    
        request.user.set_password(new_password)
        request.user.save()  # 修改密码的时候 一定要save保存 否则无法生效
    退出登陆
        auth.logout(request)  # request.session.flush()
    注册用户
            # User.objects.create(username =username,password=password)  # 创建用户名的时候 千万不要再使用create 了
            # User.objects.create_user(username =username,password=password)  # 创建普通用户
            User.objects.create_superuser(username =username,password=password,email='123@qq.com')  # 创建超级用户  邮箱必填

 

自定义auth_user表

    from django.contrib.auth.models import AbstractUser
    # Create your models here.
    # 第一种 使用一对一关系  不考虑



    # 第二种方式   使用类的继承
    class Userinfo(AbstractUser):
        # 千万不要跟原来表中的字段重复 只能创新
        phone = models.BigIntegerField()
        avatar = models.CharField(max_length=32)
    
    # 一定要在配置文件中 告诉django
    # 告诉django  orm不再使用auth默认的表  而是使用你自定义的表
    AUTH_USER_MODEL = 'app01.Userinfo'  # '应用名.类名'

 

执行数据库迁移命令

  所有的auth模块功能,全部都基于你创建的表

  而不再使用auth_user

 

转载于:https://www.cnblogs.com/TZZ1995/p/11587507.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值