zoukankan      html  css  js  c++  java
  • 五十二、django 中间件,csrf跨站请求伪造,auth模块表

    django 中间件
        django中间件事类似django的保安,请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models),
        响应走的时候也需要经过中间件才能到达web服务网关接口
    django中间件中有五个用户可以自定义的方法
    django中间件可以用来做什么?
    1.网站全局的身份校验,访问频率限制,权限校验。。只要涉及到全局的校验都可以在中间件中完成
    2.django的中间件是所有web框架中,做的最好

    需要掌握的方法有:
    1.process_request()方法
    规律
    1.请求来的时候,会经过每个中间件里面的process_request方法
    2.请求来的时候会从上往下依次执行process_request方法,如果没有会直接跳过,去下一个
    3.当process_request()方法中,return HttpResponse("")对象, 会直接值返回给浏览器,后面中间件和视图层就不走了
    基于该特点就可以做访问频率限制,身份校验,权限校验

    2.process_response()方法
    规律
    1.响应走的时候。等到执行完视图函数,会由下往上依次执行process_response方法,如果没有会直接跳过,去下一个
    2.必须return response,因为形参response指代的就是返回给前端的数据

    了解:
    3.process_view()
    #.在路由匹配成功,视图函数执行之前触发
    4.process_exception()
    #只要视图函数一旦报错,立马会触发process_exception方法
    5.process_template_response()
    # 当你返回的HttpResponse对象中必须包含render属性才会触发

    总结:只要形参中有response,就必须返回,response是给前端的信息

    自定义我们自己的中间件:
    1.如果想自定义中间件,就必须先继承MiddlewareMixin
    2.定义中间件,要去settings里面中间件手动添加

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    
    class MyMdd(MiddlewareMixin):
        def process_request(self, request):
            print("我是第一个中间件process_request方法")
            # return HttpResponse("逗比")
    
        def process_response(self, request, response):
            print("我是第一个中间件process_response方法")
            # print(response)
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print("我是第一个中间件process_view方法")
    
        def process_exception(self, request, exception):
            print("我是第一个 process_exception")
    
        def process_template_response(self, request, response):
            print("我是第一个中间件process_template_response方法")
            return response
    
    class MyMdd1(MiddlewareMixin):
        def process_request(self, request):
            print("我是第二个中间件process_request方法")
    
        def process_response(self, request, response):
            print("我是第二个中间件process_response方法")
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print("我是第二个中间件process_view方法")
    
        def process_exception(self, request, exception):
            print("我是第二个 process_exception")
    
        def process_template_response(self, request, response):
            print("我是第一个中间件process_template_response方法")
            return response
    自定义中间件代码
    csrf跨站请求伪造

    钓鱼网站:简单说就是把网站页面给用户一模一样,让用户去输入转帐信息,通过隐藏标签,把装给对方的信息,进行修改,达到自己的目的

    防止钓鱼网站的思路:
    网站会给返回用户的form表单页面 偷偷塞一个随机字符串
    请求到来的时候 会先比对随机字符串,是否一致,如果不一致就直接拒绝

    该随机字符串有一下特点:
    1.同一个浏览器每一次访问都不一样
    2.不同的浏览器绝对不会重复

    1.form表单发送post请求的时候 需要你在form表单下写:
    {% csrf_token %}
    2.ajax发送post请求 如何避免csrf校验
    1.先在页面上写{% csrf_token %},利用标签查找 获取该input键信息
    data:{'username':'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
    2.直接书写{{ csrf_token }}
    data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
    3.你可以将该获取随机键值对的方法 写到一个js文件,之后导入即可
    {% load static %}
    {#<script src="{% static 'setjs.js' %}"></script>#}
    <script>
    $('#b1').click(function () {
                $.ajax({
                    url:'',
                    type:'post',
                    // 第一种方式
                    data:{'username':'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
                    // 第二种方式
                    data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
                    // 第三种方式 :直接引入js文件
                    data:{'username':'jason'},
                    success:function (data) {
                        alert(data)
                    }
                })
            </script>

    1.当你往回走哪全局都需要校验csrf的时候 有几个不需要校验该如何处理
    2.当你网站全局不校验csrf的时候 有几个需要校验又该如何处理
    # 校验csrf
    from django.views.decorators.csrf import csrf_exempt, csrf_protect #
    from django.utils.decorators import method_decorator
    这两个装饰器在CBV装饰有区别

    csrf_exempt 取消校验
    只能给display加装饰器
    @method_decorator(csrf_exempt) # 第一种可以不检验
    def dispatch(self, request, *args, **kwargs):
    return super().dispatch(request, *args, **kwargs)

    csrf_protect 校验,三种方式

    # 第一种校验方式:
            # @method_decorator(csrf_protect, name="post")
            class MyView(View):
                # 第三校验种方式:
                # @method_decorator(csrf_protect)  # 这种方式get和post都加上了
                def dispatch(self, request, *args, **kwargs):
                    return super().dispatch(request, *args, **kwargs)
    
                def get(self, request):
                    return HttpResponse("get")
    
                # 第二种方式:
                # @method_decorator(csrf_protect)
                def post(self, request):
                    return HttpResponse("post")
    auth模块表
    执行数据库迁移命令之后 会生成很多表 其中的auth_user是一张用户相关的表格
    添加数据
    执行 createsuperuser 创建超级用户 这个超级用户就可以登陆django admin 后台
    方法:
    1. # 查询auth表
    user_obj = auth.authenticate(username=username, password=password)
    # 查询表的情况,返回对象,里面密码存的是密文


    2.auth.login(request, user_obj) # 将用户状态记录到session表中,客户端session 同上
    # 只要执行力这一句话 你就可以在后端任意位置通过request.user获取到当前用户对象"""
    # print(request.user.username)
    # print(request.user.password)

    3.判断用户是否登陆,登陆是True
    # request.user.is_authenticated)


    4.修改密码的方法:
    is_right = request.user.check_password(old_password) # 自动加密,核对数据库的密码是否正确
    if is_right: # 核对正确就是True
    print(is_right)
    request.user.set_password(new_password) # 设置新密码
    request.user.save() # 保存修改密码信息



    5.注销
    # 注销
    @login_required
    def logout(request):
    auth.logout(request) # 前后端的session值都一起删掉 等价于flush
    return HttpResponse("退出了")

    auth模块登陆装饰器
    from django.contrib.auth.decorators import login_required
    可以在settings里面配置:
    LOGIN_URL = "/land/",以后登陆都调到此网页


    用auth自定义表,可以添加字段,同时使用auth模块语法
    from django.db import models
    from django.contrib.auth.models import AbstractUser
    第二种方式 使用类的继承可以用auth表添加字段
    class Userinfo(AbstractUser):
    # 千万不要跟原来表中的字段重复 只能创新
    phone = models.BigIntegerField()
    avatar = models.FileField(upload_to="/avatar")

    还需要在文件配置中告诉django不使用默认的表
    告诉django不再使用之前的表,使用自定义的表
    AUTH_USER_MODEL = "app01.Userinfo" # 应用名.类名
  • 相关阅读:
    markdown syntax
    solidity_mapping_implementation
    paramiko 模块安装和使用
    检测服务运行的脚本
    系统非正常关机启动后出现:an error occurred during the file system
    bacula 备份恢复
    socket 网络编程
    Python 8 协程/异步IO
    Linux系统通过console口连接交换机
    Python 7 多线程及进程
  • 原文地址:https://www.cnblogs.com/wukai66/p/11604461.html
Copyright © 2011-2022 走看看