美文网首页
Middleware

Middleware

作者: xncode | 来源:发表于2019-07-25 11:17 被阅读0次

    middleware轻量级的底层插件,接收get_response函数,返回一个可调用的东西,被调用时接收request,最后返回response

    写一个middleware:

    __init__构造器 必须接收且只接收get_response参数,同时注意只在服务器启动时被调用一次
    可添加三种额外方法
    
        process_view(request, view_func, view_args, view_kwargs)
        process_exception(request, exception)
        process_template_response
    

    1、在调用view之前,会按照设置的MIDDLEWARE顺序,处理request(即在调用get_response函数之前的部分)
    2、如果该请求通过了本middleware,应调用接收的get_response函数来传递到下一个middleware
    3、如果通过了所有的middleware,开始调用view
    4、接收view返回的response,此返回即get_response调用的返回
    5、因为之前的middleware是递归调用的,此时会按照MIDDLEWARE反序,处理response(即在调用get_response函数之后的部分)

    # 处理request
    xxxxxx
    xxxxxx
    
    # 调用view或下一个middleware
    response = self.get_response(request)
    
    # 处理response
    xxxxxx
    xxxxxx
    

    另外,关于可添加的三种方法:

    process_view会在view被调用之前调用,返回None则继续传递,返回response则结束(按MIDDLEWARE的顺序全部调用)
    process_exception处理view产生的异常(按MIDDLEWARE的反序全部调用)
    process_template_response如果response是TemplateResponse会调用(按MIDDLEWARE的反序全部调用)
    

    使用了MiddlewareMixin可兼容,但注意

    老式的process_response总是会被调用,但现在,如果一个middleware处理时返回了response,此时,只有排列在其之前的middleware的处理response的部分会被调用
    
    老式的process_exception还会处理在middleware中抛出的异常
    
    老式的处理response的部分如果抛出异常,其他的middleware的处理就不会执行,但新式的会把middleware抛出的异常包装为response来继续流程
    

    相关文章

      网友评论

          本文标题:Middleware

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