美文网首页
Django 十一

Django 十一

作者: 吃可爱长大鸭 | 来源:发表于2021-11-04 16:45 被阅读0次

    目录

    1.cbv加装饰器
    2.中间件介绍和常用内置中间件
    3.django内置中间件
    4.django自定义中间件
    5.django中处理csrf
    6.全局使用csrf,局部视图函数禁用csrf
    

    1.cbv加装饰器

    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='get') #给get请求加装饰器还可以加post
    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')
    
    from app01 import views
    url(^'index/', views.Index.as_view())
    

    总结

    1-cbv加装饰器可以加在类上:
    @method_decorator(auth,name='post') #给get请求加装饰器
    2-可以加在方法上
    @method_decorator(auth)
    def get(self, request, *args, **kwargs):
        pass
    

    2.中间件介绍和常用内置中间件

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

    3.django内置中间件

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

    4.django自定义中间件

    在应用目录下新建middleware.py文件
    1 请求来了触发它,从上往下依次执行(在setting中中间件注册的位置)
    from django.utils.deprecation import MiddlewareMixin
    
    class MyMiddleWare(MiddlewareMixin):
        def process_request(self, request):
                如果返回None,就继续往下走
                如果返回四件套之一,直接就回去了
        
                2 在这里面写请求来了的一些判断
                3 request.META.REMOTE_ADDR  #客户端地址
                4 request.META.HTTP_USER_AGENT  # 客户端类型
              
        def process_response(self, request, response): 
            print('请求走了')
            return response  #一定要return response
            1 请求走了,会触发它,从下往上执行
            2 在所有的响应中都写入cookie name=lqz
            request.set_cookie('name','laz')
            3 在所有的响应头中都写入 response['x-head']='xxx'
    

    4.1process_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.2 process_exception(了解)

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

    4.3 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.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>
    <button class="btn">转帐</button>
    3 如果是ajax提交:两种方案
    <script>
        $('#btn').click(function () {
            $.ajax({
                url: '/transfer/',
                method: 'post',
                data: {
                    user: $('#id_name').val(),
                    money: $('#id_money').val(),
                    csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val()
                },
             //  data: {
                    user: $('#id_name').val(),
                    money: $('#id_money').val(),
                    csrfmiddlewaretoken:{{ csrf_token }}
                success: function (data) {
                    console.log(data)
                }
            })
        })
    </script>   
    

    5.1.cookie的处理

    <script src="/static/jquery.cookie.js"></script>
    
    var token=$.cookie('csrftoken')
    

    5.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.全局使用csrf,局部视图函数禁用csrf

    1 在视图函数上加装饰器
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # 不再检测,局部禁用(前提是全站使用)
    # @csrf_exempt
    # 检测,局部使用(前提是全站禁用)
    @csrf_protect
    def csrf_token(request):
    

    相关文章

      网友评论

          本文标题:Django 十一

          本文链接:https://www.haomeiwen.com/subject/mmsxzltx.html