当前位置: 首页 > 后端技术 > Python

求源码阅读-Day3

时间:2023-03-26 11:06:32 Python

求源码阅读-Day3求源码阅读-Day3hookshooks初始化hooks使用cookieshookshooks初始化继续前面的分析,来挂钩类Session(SessionRedirectMixin)的一部分:__attrs__=['headers','cookies','auth','proxies','hooks','params','verify','cert','prefetch','adapters','stream','trust_env','max_redirects',]def__init__(self):#:一个不区分大小写的头字典,在每个#::class:`Request`sentfrom这个#::class:`Session`。自己。headers=default_headers()print("headers=",self.headers)#:默认身份验证元组或对象附加到#::class:`Request`。self.auth=None#:字典映射协议或协议和主机到代理的URL#:(例如{'http':'foo.bar:3128','http://host.name':'foo.bar:4012'})to#:beusedoneach:class:`Request`。self.proxies={}#:事件处理挂钩。self.hooks=default_hooks()....看到调用了default_hook方法,然后在文件开头可以看到hooks.pyfrom.hooksimportdefault_hooks,dispatch_hooktohooks.py这个文件查看:"""requests.hooks这个模块提供了Requestshooks系统的能力。Availablehooks:response:TheresponsegeneratedfromaRequest."""HOOKS=['response']defdefault_hooks():return{event:[]for在HOOKS
事件中写了一句,什么意思?通过注释我们知道**hooks是事件挂钩的意思,可以用来操作部分请求过程或者信号事件处理。**requests有一个钩子系统,它在请求生成响应响应之前做一些你想做的事情。上面源码中的default_hooks()方法使用了字典解析,最后返回{'response':[]}。###hooks的使用下面简单介绍一下hooks的使用方法。首先,我们需要将字典{hook_name:callback_function}传递给参数hooks。hook_name是钩子名称,即“response”,callback_function是钩子方法,当目标事件发生时回调。callback_function将接受一个数据块作为它的第一个参数,定义如下defcallback_function(r,*args,**kwargs)。从default_hooks()方法返回的hooks默认参数{'response':[]}中,key“response”对应的值是一个列表。也就是说,对于一个hook事件,可以有多个hook方法。下面我们写个例子来演示一下。defhooks1(r,args,*kwargs):...print("hooks1url="+r.url)...defhooks2(r,args,*kwargs):...print("hooks2encoding="+r.encoding)...hooks=dict(response=[hooks1,hooks2])requests.get("http://httpbin.org",hooks=hooks)hooks1url=http://httpbin.org/hooks2encoding=utf-8##Cookies继续分析并查看cookies初始化:#:一个CookieJar,包含在此#:session上设置的所有当前未完成的cookies。默认情况下,它是一个#::class:`RequestsCookieJar`,但#:可以是任何其他``cookielib.CookieJar``兼容对象。self.cookies=cookiejar_from_dict({})这里的cookiejar_from_dict导入到文件开头的cookies.py中:from.cookiesimport(cookiejar_from_dict,extract_cookies_to_jar,进入cookies.py查看这个方法:defcookiejar_from_dict(cookie_dict,cookiejar=None,overwrite=True):"""从键/值字典中返回一个CookieJar。:paramcookie_dict:Dictofkey/valuestoinsertintoCookieJar.:paramcookiejar:(可选)将cookie添加到的cookiejar。:paramoverwrite:(可选)如果为False,将不会用新的替换jar中已有的cookie。:rtype:CookieJar“”“如果cookiejar为None:cookiejar=RequestsCookieJar()ifcookie_dictisnotNone:names_from_jar=[cookie.nameforcookieincookiejar]fornameincookie_dict:ifoverwriteor(namenotinnames_from_jar):cookiejar.set_cookie(create_cookie(name,cookie_dict[name]))返回cookiejar这里的RequestsCookieJar()是什么?找到这个文件中的RequestsCookieJar方法类RequestsCookieJar(cookielib.CookieJar,MutableMapping):...可以看到这里使用了多重继承,继承了cookielib.CookieJar和MutableMapping类,问题:`1.什么继承这两个类的目的是什么?``2.前面的cookiejar=RequestsCookieJar()到底是做什么的?`分别回答:1.继承这两个类是为了后面调用MutableMapping的方法,前面已经分析过了章节ers,这里就不解释了2.RequestsCookieJar()其实调用了cookielib.CookieJar中的`__init__`方法cookies.pyfrom.compatimportcookielib,urlparse,urlunparse,Morsel,MutableMapping->在compat.py中调用了cookielib,继续分析并调用http模块中的cookiejar...elifis_py3:fromurllib.parseimporturlparse,urlunparse,urljoin,urlsplit,urlencode,quote,unquote,quote_plus,unquote_plus,urldefragfromurllib.requestimportparse_http_list,getproxies,proxy_bypass,proxy_bypass_environment,getproxies_environmentfromhttpimportcookiejarascookielib然后去http模块查看这个cookiejarhttp/cookiejar.pyinsideclassCookieJar:"""HTTPcookies的集合。你可能不需要知道这个类:tryurllib.request.build_opener(HTTPCookieProcessor).open(url)."""non_word_re=re.compile(r"\W")quote_re=re.compile(r"([\"\\])")strict_domain_re=re.compile(r"\.?[^.]*")domain_re=re.compile(r"[^.]*")dots_re=re.compile(r"^\.+")magic_re=re.compile(r"^\#LWP-Cookies-(\d+\.\d+)",re.ASCII)def__init__(self,policy=None):...看完大概知道这个模块的作用是管理HTTPcookie值和存储HTTP请求est生成cookie,将cookie对象添加到传出的HTTP请求中。cookies初始化方法cookiejar_from_dict(cookie_dict,cookiejar=None,overwrite=True)用于转换字典类型的cookies插入cookiejar,返回cookiejar