(四)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('')

猜你喜欢

转载自blog.csdn.net/changerjjlee/article/details/80547204