ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

为什么这个参数用flow: http.HTTPFlow,随便写一个叫request可以吗

为什么这个参数用flow: http.HTTPFlow,随便写一个叫request可以吗 简易 Mock mitmproxy 插件-详解为什么这个参数用flow: http.HTTPFlow随便写一个叫request可以吗先把flow: http.HTTPFlow拆成两部分看它其实是两件事defresponse(flow:http.HTTPFlow):# ↑参数名 ↑类型注解flow是参数名变量名: http.HTTPFlow是类型注解type hint只是标注「这个参数是 HTTPFlow 类型」一、参数名能不能随便改能。参数名叫什么对mitmproxy完全没影响。mitmproxy调用你的response时是按位置把flow对象传进来的不看你参数叫什么名字。所以下面这样完全能跑defresponse(request):ifnot_is_target(request):returnrequest.response.set_content(...)但有个大坑你把参数命名成request可它实际装的是flow对象不是请求。真正的请求要request.request才能拿到响应要request.response。读代码的人包括你自己过两周会被这个名字误导以为它是个请求对象。所以命名成flow不是语法要求是约定mitmproxy官方文档、几乎所有插件都叫它flow因为它代表「一次完整的请求-响应流程」里面同时装着request和response。名字是给人看的起个准确的名字省得自己坑自己。二、函数名不能随便改。这里要分清楚参数名随便函数名不随便。mitmproxy是靠函数名去找钩子的。它内部大概是这样找的# mitmproxy 内部伪代码响应回来后看你脚本里有没有叫 response 的函数ifhasattr(你的脚本,response):你的脚本.response(flow)# 有就调用把 flow 传进去所以函数名必须是response或request/load这些约定名改成my_response就永远不会被调用脚本等于没生效参数名叫 flow、f、x 都行位置对就能收到对象三、类型注解: http.HTTPFlow能不能去掉能。它对运行没有任何影响Python不会因为注解去做类型检查。写不写都能跑defresponse(flow):# 能跑defresponse(flow:http.HTTPFlow):# 也能跑多了类型提示保留它的好处是编辑器能给你自动补全。写了注解你敲flow.时编辑器就知道它是HTTPFlow会提示.request、.response这些属性少查文档少写错。总结项能不能随便改说明函数名response不能mitmproxy按函数名找钩子改了就不触发参数名 flow能只是变量名但叫 flow 是行业约定别叫 request 免得误导类型注解http.HTTPFlow能去掉只影响编辑器补全不影响运行一句话函数名是给mitmproxy认的不能改参数名和类型注解是给人和编辑器看的可以改但按约定叫flow最省心。
返回列表