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加    



  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


   

posted @ 2019-06-18 23:21  团子I不哭  阅读(138)  评论(0编辑  收藏  举报