遵循http重定向的lowhaio包装器
lowhaio-redirect的Python项目详细描述
lowhaio重定向
遵循http重定向的lowhaio包装器
安装
pip install lowhaio lowhaio_redirect
用法
从lowhaio.Pool
返回的request
函数必须用lowhaio_redirect.redirectable
包装,如下例所示。
importosfromlowhaioimportPoolfromlowhaio_redirectimportredirectablerequest,_=Pool()redirectable_request=redirectable(request)code,headers,body=awaitredirectable_request(b'GET','https://example.com/path')asyncforchunkinbody:print(chunk)
方法和身体变化
默认行为如下。
301302来自post的重定向转换为带有空主体的get;所有其他请求都不会更改方法和主体。
303重定向,所有非head和get请求都转换为带有空主体的get。
307和308重定向,方法和主体始终不变。
但是,请注意,未更改的主体实际上是not由此包装保证的。对于每个请求,作为body
参数传递的函数都被调用,并且在每次调用时它可能返回不同的内容。由开发人员根据需要处理这种情况:没有一种适合所有人的方法,因为对于流式请求,主体可能不再可用。在许多情况下,期望重新提交大型上载的重定向可能是一个错误;或者如果永远不期望api返回重定向,not使用此包装可能是一个可行的选项,相反,如果从服务器返回重定向,则会引发异常的几行代码。
自定义重定向
可以自定义遵循哪些重定向,以及它们如何影响方法和正文。例如,要显式地重新创建默认行为,可以使用下面的代码。
defget(method,body,body_args,body_kwargs,headers):# Asynchronous generator that end immediately, and results in an empty bodyasyncdefempty_body():whileFalse:yieldnext_request_headers=tuple((key,value)forkey,valueinheadersifkey.lower()notin(b'content-length',b'transfer-encoding'))return(b'GET',empty_body,(),(),next_request_headers)defunchanged(method,body,body_args,body_kwargs,headers):return(method,body,body_args,body_kwargs,headers)redirectable_request=redirectable(request,redirects=((b'301',lambdamethod:unchangedifmethod!=b'POST'elseget),(b'302',lambdamethod:unchangedifmethod!=b'POST'elseget),(b'303',lambdamethod:unchangedifmethodin(b'GET',b'HEAD')elseget),(b'307',lambdamethod:unchanged),(b'308',lambdamethod:unchanged),))
授权标题
默认情况下,如果重定向到另一个域,则不会将授权头传递给。这可以定制。例如,要显式地重新创建默认行为,可以使用下面的代码。
defstrip_authorization_if_different_host(request_headers,request_host,redirect_host):forbidden= \ (b'authorization',)ifrequest_host!=redirect_hostelse \ ()returntuple((key,value)forkey,valueinrequest_headersifkey.lower()notinforbidden)redirectable_request=redirectable(request,transform_headers=strip_authorization_if_different_host)