(四)Django进阶之路 中间件

中间件 是嵌入 django 的 request / response 处理过程的一套钩子框架,即可以对django的输入输出做整体修改,是一个可整体插拔的组件模式,有如下使用场景
1. 修改请求,例如在在request到达views之前做权限处理或者token比对,数据解密
2. 修改响应,判断浏览器来源,添加应用体系的响应状态码,数据加密,数据压缩


中间件作用流程:(Django中间件 必须是一个类, 不需要继承任何类 ,并实现四个接口)
1.process_request:(self,request)该方法在请求到来的时候调用
2.process_view(self,request,fnc,arg,kwarg):在本次将要执行的view函数被调用前调用本函数
3.process_response(self,request,response):在执行完View函数准备将响应发到客户端前被执行
4.process_exception(self,request,exception) View函数抛出异常时该函数被调用,得到的exception参数是实际上抛出异常实例。通过此方法可以进行很好的错误控制,提供友好的用户界面。
5.要激活中间件,需要把它添加到Django的工程配置文件的MIDDLEWARE_CLASSES元祖中,据此元祖顺序,遵循先进请求后出响应的原则

中间件响应流程图

图片来源https://code.ziqiangxuetang.com/django/django-middleware.html

自定义中间件(判断请求来源),目录结构与与源码如下:
example
–migrations
–templates
–_ init _.py
–admin.py
–apps.py
–middleware.py
–models.py
–urls.py
–views.py
middleware
–_ init _.py
–settings.py
–urls.py
–wsgi.py
manage.py


middleware.py

class CheckSourceMiddware(object):
    def process_request(self, request):
        from_source = request.MATA['HTTP_USER_AGENT']
        if 'PC' in from_source:
            request.session['from_source'] = 'pc'
        else:
            request.session['from_source'] = 'other'

settings.py

MIDDLEWARE_CLASSES = [
    #.........省略........
    'example.middleware.CheckSourceMiddware.'
    'example.middleware.ForbideSomeHostMiddleWare.'
]

views.py

def index(request):
    from_source = request.session.get('from_source', 'unknow')
    return HttpResponse('You are from %s'% from_source )

urls.py

自行定义路由

middleware.py

class ForbideSomeHostMiddleWare(object):
    def process_request(self, request):
        allow_ip = ['127.0.0.1',]
        ip = request.META['REMOTE_ADDR']
        if ip not in allow_ip:
            return HttpResponse('ip not allowed')

    def process_response(self, request, response)
            pass
            #return HttpResponse('')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaysenLeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值