Requests教程-11-重定向与请求历史

领取资料,咨询答疑,请➕wei:  June__Go

上小节中,我们学习了requests的Session会话对象,本小节我们讲解一下requests的重定向与请求历史。

重定向的定义:

重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。

重定向的使用场景:

1.网站调整(如改变网页目录结构

2.网页被移到一个新地址

3.网页扩展名改变(如应用需要把.php改成.Html或.shtml)

这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

重定向划分:

301 redirect---》永久性重定向、302 redirect---》暂时性重定向,比如下图的302永久性重定向

默认情况下,requests发送的请求除了方式为HEAD之外,其余的请求例如GET、POST等都是能自动进行重定向的。

请求历史与重定向追踪

关于请求历史记录,requests库提供了history属性来保存每次请求的历史记录。可以通过查看response.history列表来获得之前经过的重定向路径。示例如下

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
}

r = requests.get("http://www.360buy.com", headers=headers)

print("历史请求过程信息:")
print(r.history)
for one_info in r.history:
    print(one_info.status_code, one_info.url, one_info.headers)

print("\n\n最后一次的请求信息:")
print(r.status_code, r.url, r.headers)

运行结果如下:

历史请求过程信息:
[<Response [301]>, <Response [302]>]
301 http://www.360buy.com/ {'Server': 'nginx', 'Date': 'Wed, 03 Jan 2024 09:38:25 GMT', 'Content-Type': 'text/html', 'Content-Length': '178', 'Connection': 'keep-alive', 'Location': 'http://www.jd.com/', 'Age': '1342', 'Via': 'http/1.1 ORI-CLOUD-HUZ-MIX-16 (jcs [cRs f ]), http/1.1 AHwuhu-UNI-1-MIX-168 (jcs [cSsSfU])', 'Access-Control-Allow-Origin': '*', 'Timing-Allow-Origin': '*', 'X-Trace': '301-1704273363325-0-0-0-0-0;301-1704274705923-0-0-0-1-1;301-1704274705917-0-0-0-22-22'}
302 http://www.jd.com/ {'Server': 'nginx', 'Date': 'Wed, 03 Jan 2024 09:38:25 GMT', 'Content-Type': 'text/html', 'Content-Length': '138', 'Connection': 'keep-alive', 'Location': 'https://www.jd.com/', 'Timing-Allow-Origin': '*', 'X-Trace': '302-1704274705996-0-0-0-0-0', 'Strict-Transport-Security': 'max-age=3600'}


最后一次的请求信息:
200 https://www.jd.com/ {'Server': 'nginx', 'Date': 'Wed, 03 Jan 2024 09:38:26 GMT', 'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '61627', 'Connection': 'keep-alive', 'Vary': 'Accept-Encoding', 'init-worker-firstscreen': 'off', 'init-worker-mobile-ua-check': 'on', 'init-worker-mobile-ua-check-rate': 'on', 'init-worker-forbid-method': 'on', 'init-worker-ump-reffer': 'on', 'init-worker-pageconfig': 'on', 'init-worker-jsversion': 'on', 'init-worker-jsversion-new': 'on', 'init-worker-miaoshaRefreshTime': 'on', 'init-worker-navitems-hide-switch': 'on', 'init-worker-double-cookie-white-list': 'on', 'init-worker-double-cookie-switch': 'on', 'init-worker-image-layer-switch': 'on', 'init-worker-page-maxAge': 'on', 'Cache-Control': 'max-age=60', 'Expires': 'Wed, 03 Jan 2024 09:39:00 GMT', 'Origin-Agent-Cluster': '?0', 'Content-Encoding': 'gzip', 'ser': '8.69', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'X-Frame-Options': 'SAMEORIGIN', 'Age': '11', 'Via': 'http/1.1 ORI-CLOUD-HUZ-MIX-29 (jcs [cMsSfW]), http/1.1 JS-UNI-2-MIX-222 (jcs [cRs f ])', 'Timing-Allow-Origin': '*', 'X-Trace': '200-1704274695501-0-0-16-47-47;200-1704274695455-0-0-0-71-71;200-1704274706057-0-0-0-1-1', 'Strict-Transport-Security': 'max-age=3600'}


重定向的重启和禁用

在发送请求的时候,可以通过如下的设置,取消/重启requests模块的自动重定向功能

requests.get(url, allow_redirects=False)

其中,allow_redirects字段为True时代表开启重定向,requsets默认为True,为False时代表禁用重定向,以下是禁止重定向的一个示例

import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code)
print(r.history)

运行结果如下:

301
[]

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!领取资料,咨询答疑,请➕wei:  June__Go

<think>好的,用户想了解如何使用Pythonrequests库处理带有重定向的接口。首先,我得回忆一下requests库的基本用法,尤其是关于重定向的部分。记得默认情况下,requests会自动处理重定向,比如GET或HEAD请求,但POST请求可能会遇到问题,因为重定向可能会导致数据丢失或者方法被改变。 接下来,我需要考虑用户可能的场景。他们可能在调用某个API时遇到了重定向的问题,比如被重定向到了其他地址,或者想手动控制重定向的过程。用户可能想知道如何禁用自动重定向,以便自己处理302或301响应,或者需要获取重定向历史记录。 然后,要覆盖几个关键点:默认行为、禁用自动重定向、获取重定向历史、处理POST请求重定向问题。可能需要举例说明,比如使用allow_redirects参数,或者检查response.history来追踪重定向路径。 还需要注意不同HTTP方法在重定向时的表现,比如POST请求重定向时可能会变成GET,导致数据丢失,这时候用户可能需要手动处理。此外,安全考虑也很重要,比如避免重定向到恶意网址,需要验证URL。 最后,组织内容结构,分步骤解释,确保用户能一步步理解和应用。检查是否有遗漏的情况,比如其他HTTP方法,或者需要设置headers的情况。确保示例代码正确,语法无误,并且符合中文习惯。</think>在Python中使用`requests`库请求带有重定向的接口时,需注意以下几个关键点: --- ### **1. 默认行为** 默认情况下,`requests`会自动处理重定向(状态码301/302/307等),例如: ```python import requests response = requests.get("https://example.com/redirect_endpoint") print(response.url) # 输出最终重定向后的URL print(response.status_code) # 输出200(最终响应状态码) ``` --- ### **2. 禁用自动重定向** 通过`allow_redirects=False`可禁用自动重定向,手动处理跳转: ```python response = requests.get("https://example.com/redirect_endpoint", allow_redirects=False) print(response.status_code) # 输出302(临时重定向状态码) print(response.headers['Location']) # 获取重定向目标URL ``` --- ### **3. 追踪重定向历史** 通过`response.history`可查看所有重定向路径: ```python response = requests.get("https://example.com/redirect_chain") for resp in response.history: print(f"跳转路径:{resp.url} → 状态码:{resp.status_code}") print(f"最终URL:{response.url}") ``` --- ### **4. POST请求重定向问题** - 重定向时,浏览器通常会将POST转为GET(根据HTTP规范) - `requests`默认对POST请求也自动处理重定向,但可能导致数据丢失: ```python # 默认允许重定向(可能丢失POST数据) response = requests.post("https://example.com/post_redirect", data={"key": "value"}) # 强制禁止重定向以保护POST数据 response = requests.post("https://example.com/post_redirect", data={"key": "value"}, allow_redirects=False) ``` --- ### **5. 手动处理重定向** 当需要自定义重定向逻辑时(如修改请求头/参数): ```python url = "https://example.com/initial_endpoint" while True: response = requests.get(url, allow_redirects=False) if response.status_code in (301, 302, 303, 307): url = response.headers['Location'] print(f"手动跳转到:{url}") else: break ``` --- ### **6. 安全注意事项** - 验证重定向目标:防止跳转到恶意URL - 敏感数据保护:重定向时避免在URL中传递敏感参数 - 循环检测:手动处理时需添加最大跳转次数限制 --- ### **总结场景** | 场景 | 解决方案 | |-------|-------| | 需要最终响应 | 使用默认`allow_redirects=True` | | 获取跳转路径 | 检查`response.history` | | 保护POST数据 | 设置`allow_redirects=False` | | 自定义跳转逻辑 | 手动循环处理`Location`头 | 可通过`response.request`属性查看实际发送的请求信息,用于调试重定向过程中的请求变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值