美文网首页
Django Middleware

Django Middleware

作者: raku | 来源:发表于2018-10-16 19:32 被阅读0次

    Django Middleware

    这里说的是 Django 1.8.7 的中间件
    官方文档在这里 Middleware | Django documentation | Django

    Django——中间件详解 - 听风。 - 博客园
    Django中间件 - 让我们忘了那片海 - 博客园

    PS 上面的说明经常提到视图 这个翻译太糟糕了
    process_view 指的就是所请求的方法

    在官方文档中是这么说的

    process_view(request, view_func, view_args, view_kwargs)

    request is an HttpRequest object. view_func is the Python function that Django is about to use. (It’s the actual function object, not the name of the function as a string.) view_args is a list of positional arguments that will be passed to the view, and view_kwargs is a dictionary of keyword arguments that will be passed to the view. Neither view_args nor view_kwargs include the first view argument (request).

    process_view() is called just before Django calls the view.

    It should return either None or an HttpResponse object. If it returns None, Django will continue processing this request, executing any other process_view() middleware and, then, the appropriate view. If it returns an HttpResponse object, Django won’t bother calling the appropriate view; it’ll apply response middleware to that HttpResponse and return the result.

    关于 return

    虽然官方文档在process_request 中说

    If it returns an HttpResponse object, Django won’t bother calling any other request, view or exception middleware, or the appropriate view; it’ll apply response middleware to that HttpResponse, and return the result.
    但是我的实验结果并不一样 可能是有什么错误?

    如果中间件的注册顺序是 M1 M2 M3
    在 M1 的 request 中 return 了 HTTPResponse
    M2 M3 的 request view 都不会执行 直接到了 response 阶段 逐步向上返回 response (也就是说在 M1 之后的中间件受影响)

    在 M1 的 view 中 return 了 HTTPResponse
    M2 M3的 request会执行 view不会执行 response 都执行

    response 一直都会执行的
    Unlike the process_request() and process_view() methods, the process_response() method is always called, even if the process_request() and process_view() methods of the same middleware class were skipped (because an earlier middleware method returned an HttpResponse)

    PS 关于 django 验证 csrf 的合法性

    django 是拿POST 请求体中的 csrf 值和 cookie 中的 csrf 值做比较
    在 middleware 的 csrf.py中有这么一段

    if not _compare_salted_tokens(request_csrf_token, csrf_token):
    
    

    csrf_token 是cookie 中的 token request_csrf_token 是请求体中的 token

    相关文章

      网友评论

          本文标题:Django Middleware

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