zoukankan      html  css  js  c++  java
  • Django 中间件

     CBV装饰器

     写一个装饰器验证session
    def login_auth(func):
      def inner(request,*args,**kwargs):
        if request.session.get('is_login'):
          return func(request,*args,**kwargs)
           else:
          return redirect('/login/')
        return inner
    写一个类作为网站主页,必须登陆才能访问
    # 给里面的get,post方法加装饰器
    class Home(View):
      def get(self,request):
        pass
      def post(self,request):
        pass
     三种加装饰器的方法

    1,直接加在方法上,只针对那一个方法

    class MyHome(View):
        def dispatch(self, request, *args, **kwargs):
            super().dispatch(request,*args,**kwargs)
        @method_decorator(login_auth)  # 第一种
        def get(self,request):
            return HttpResponse('get')
        def post(self,request):
            return HttpResponse('post')
       
    2,类名上面加装饰器
    from django.utils.decoration import method_decorator
    @method_decorator(login_auth,name='get')  # 加在类上面的话,必须通过name指定给谁加
    class Home(View):
      def get(self,request):
        pass
      def post(self,request):
        pass
    3,方法上面加,不要用原生的装饰器,用的话,只能改参数,那样的话不通用
    class Home(View):
      @method_decorator(login_auth)
      def get(self,request):
        pass
      def post(self,request):
        pass

    # @method_decorator(login_auth,name='get')  # 第二种 name参数必须指定
    class MyHome(View):
        @method_decorator(login_auth)  # 第三种  get和post都会被装饰
        def dispatch(self, request, *args, **kwargs):
            super().dispatch(request,*args,**kwargs)
        # @method_decorator(login_auth)  # 第一种
        def get(self,request):
            return HttpResponse('get')
    
        def post(self,request):
            return HttpResponse('post')

    django中间件

    中间件类似于django的门卫,数据在进入和离开时都需要经过中间件

    django默认有七个中间件,

    但是django暴露给用户可以自定义中间件并且里面可以写五种方法
        ps:
        
            1.请求来的时候会依次执行每一个中间件里面的process_request方法(如果没有直接通过)
            2.响应走的时候会依次执行每一个中间件里面的process_response方法(如果没有直接通过)
        
        django中间件能够帮我实现 网站全局的身份验证,黑名单,白名单,访问频率限制,反爬相关
            》》》:django用来帮你全局相关的功能校验
        

    自定义中间件

            新建一个任意名字的文件夹,里面新建一个任意名字py文件
            from django.utils.deprecation import MiddlewareMixin
        

    一共有五个方法

            process_request:请求来的时候从上往下依次执行每一个中间件里面的process_request
            process_response :响应走的时候会从下往上依次执行每一个中间件里面的process_response方法                           
            process_view:路由匹配成功执行视图之前自动触发 (从上往下依次执行)
            process_exception:当视图函数报错了,自动触发 (从下往上依次执行)
            process_template_response:视图函数返回的对象有一个render()方法,或者表明该对象是一个TemplateResponse对象或等价方法)(从下往上依次执行)

     注意,如果一个中间件走process_request时直接return的话会直接走自己的process_response 返回,这个时候这个中间件后   面的中间件就不会走(可以用来设置黑名单)

    csrf(跨站请求伪造)


    什么时钓鱼网站?

    钓鱼网站:银行转账的路径,你是否也可以拿到,然后你做一个跟银行一模一样的页面,也超银行的借口提交数据,当用户在钓鱼网站输入对方账户名和转账金额之后,点击发送。其实内部是将对方账户换成了钓鱼网站的造假人员的账户。造成你转账转错账户的情况

    开两个django项目,模拟转账的现象

    如何区分钓鱼网站和正经网站?在正经网站返回页面的时候,在form表单中偷偷塞一个特殊的字符串,后端记下该页面对应的字符串的值,等用户发post请求来的时候,我先去校验特殊的字符串是否匹配

    如何去写这个特殊的字符串呢?模版语法有一个固定的写法{% csrf_token %},必须写在form表单内

    浏览器查看改标签的值,并且每次都在刷新。再来演示刚刚转账的示例

    ajax中如何设置csrf_token
        
    # 第一种页面上先写一个{%csrf_token%}标签,后面用jquery查找标签取值组成键值对放入data中即可    
        
    csrf_token局部使用    
        
    # 只想给某个视图韩式加上csrf校验
    from django.views.decorators.csrf import csrf_exempt,csrf_protect

    # 局部禁用
    @csrf_exempt
    def index(request):
      pass

    # 局部使用
    @csrf_protect
    def login(request):
      pass
     

    csrf_protect 跟正常的CBV装饰器一样      三种
    csrf_exempt  只能有下面两种方式
            @method_decorator(csrf_exempt,name='dispatch')  # 第一种
            class Index3(View):
                # @method_decorator(csrf_exempt)   # 第二种  
                def dispatch(self, request, *args, **kwargs):
                    super().dispatch(request,*args,**kwargs)  
            其实都是给dispatch加    



      


       

  • 相关阅读:
    XidianOJ 1099 A simple problem
    XidianOJ 1097 焊板子的xry111
    XidianOJ 1172 Hiking
    XidianOJ 1176 ship
    bzoj1912(树的直径)
    黑暗城堡(最短路径树)
    poj1639(k限制最小生成树)
    0-1分数规划
    tyvj1391(Kruskal)
    [Usaco2007 Nov]Cow Relays(矩阵乘法+floyd)
  • 原文地址:https://www.cnblogs.com/tuanzibuku/p/11048539.html
Copyright © 2011-2022 走看看