遵循http重定向的lowhaio包装器

lowhaio-redirect的Python项目详细描述


lowhaio重定向CircleCI

遵循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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如果没有构造器,我怎么能让这段代码实现相同的功能?   使用JMS/ActiveMQ模式/库的java并发同步RequestReply?   Java arcgis获取多段线的交点   mysql java。sql。SQLException参数索引超出范围   java通过远程接口将EJB注入servlet   java Eclipse格式化程序:相同缩进级别上的条件表达式   在junit中运行cucumber时发生java错误   java如何使用API引用JSON数组   docx文档边界外的java XWPF列(Ubuntu 16.04主机)   java为什么@RequestHeader无法捕获过滤器中添加的自定义标头   在java特殊用例中列出迭代期间添加的项   java如何使用@XmlElement注释列表?   在Android应用程序中使用JavaMail接收电子邮件时出现java错误