【 ⑫】requests库概述(文件上传、cookies处理、状态码处理、异常处理等)

简介: 【 ⑫】requests库概述(文件上传、cookies处理、状态码处理、异常处理等)

1 文件上传

使用 requests 库进行文件上传非常方便。可以通过传递一个 files 参数来指定要上传的文件。

import requests
# 设置上传的文件路径和目标 URL
file_path = 'path/to/file.jpg'
url = 'https://api.example.com/upload'
# 创建文件对象,并设置文件名和文件内容类型
files = {'file': open(file_path, 'rb')}
# 发送 POST 请求并上传文件
response = requests.post(url, files=files)
# 检查响应状态码
if response.status_code == 200:
    # 获取响应内容(文本格式)
    content = response.text
    print(f'Response content: {content}')
else:
    print('Failed to upload file. Status code:', response.status_code)

在上述示例代码中,我们首先指定了要上传的文件路径 file_path 和目标 URL url。然后,创建了一个 files 字典,其中键为 'file',值为使用 open() 函数打开文件对象。注意,这里需要将文件以二进制模式打开 ('rb')

接下来,我们使用 requests.post() 方法发送 POST 请求,并通过参数 files=files 来指定要上传的文件。

最后,我们检查响应状态码是否为 200,如果成功,则获取响应内容并打印出来。如果上传失败,则打印相应的错误信息和状态码。

注意:可以根据实际需求对文件上传进行更多的定制,例如设置文件名、文件类型等。requests 库提供了丰富的选项来满足不同的文件上传需求。可以根据具体情况进行相应的设置,并将文件对象以适当的方式传递给 requests.post() 方法。


2 cookies处理

在使用 requests 库发送网络请求时,可以方便地处理和管理 cookies。Cookies 是服务器存储在用户浏览器中的数据,用于跟踪用户会话和存储用户信息。requests 库提供了一些方法来处理和操作 cookies。

  • 获取 cookies: 可以使用 response.cookies 属性获取响应中的 cookies。它返回一个 RequestsCookieJar 对象,可以通过索引或属性名访问特定的 cookie 值。
  • 发送 cookies: 可以通过传递 cookies 参数将 cookies 添加到请求中。cookies 参数可以是一个字典,其中键为 cookie 名称,值为 cookie 值。
  • 保存 cookies: 通过设置 session 属性为 True,可以创建一个会话对象,该对象将自动保存和管理 cookies。在后续请求中,会话对象会自动发送之前收到的 cookies,并接收和更新新的 cookies。

示例代码

import requests
# 发送 GET 请求并获取 cookies
response = requests.get('https://api.example.com')
cookies = response.cookies
# 将 cookies 添加到后续请求中
url = 'https://api.example.com/data'
response = requests.get(url, cookies=cookies)
# 创建会话对象,并保存 cookies
session = requests.Session()
response = session.get('https://api.example.com/login')
# 做其他操作,会话对象会自动发送和接收 cookies
response = session.get('https://api.example.com/profile')

在上述示例代码中,我们首先发送一个 GET 请求并获取响应中的 cookies。通过 response.cookies 属性可以获得一个 RequestsCookieJar 对象,其中包含了响应中的 cookies。

接下来,我们将 cookies 添加到后续请求中,通过 cookies=cookies 参数传递给 requests.get() 方法。这样,在发送请求时会自动带上之前收到的 cookies。

另外,我们还创建了一个会话对象 session,通过 requests.Session() 创建。会话对象会自动保存和管理 cookies。在后续的请求中,直接使用会话对象发送请求,会话对象会自动发送和接收 cookies。

注意:需要注意的是,如果没有指定会话对象或手动处理 cookies,requests 库默认会将每个请求视为相互独立的,不会自动处理 cookies。

cookie从需要在开发者工具的抓包中找:


3 状态码处理

requests 库提供了一种简便的方式来处理 HTTP 请求的响应状态码。在发送请求后,可以通过访问 response.status_code 属性来获取响应的状态码,并根据状态码进行相应的处理。

以下是一些常见的 HTTP 状态码和其含义:

状态码 意义
200 OK 请求成功,信息在返回的响应报文中
201 Created 请求成功,并在服务器上创建了新资源
204 No Content 请求成功,但响应中没有返回任何内容
301 Moved Permanently 请求的对象已经被永远的转移了,新的URL定义在响应报文的Location,首部行中,客户软件将自动获取新的URL
400 Bad Request 一个通用的差错代码,指示该请求不能被服务器理解
401 Unauthorized 请求未被授权,需要提供有效的身份验证信息
403 Forbidden 请求被服务器拒绝,通常是因为权限不足
404 Not Found 被请求的文档不在服务器上
500 Internal Server Error 服务器内部发生错误,无法完成请求
505 HTTP Version Not Supported 服务器不支持请求报文使用的HTTP协议版本

示例代码

import requests
# 发送 GET 请求
response = requests.get('https://api.example.com')
# 获取响应状态码
status_code = response.status_code
# 根据状态码进行处理
if status_code == 200:
    print('Request successful')
elif status_code == 404:
    print('Page not found')
elif status_code == 500:
    print('Internal Server Error')
else:
    print('Unexpected status code:', status_code)

在上述示例代码中,我们发送了一个 GET 请求到 'https://api.example.com'。然后,通过访问 response.status_code 来获取响应的状态码,并将其赋值给变量 status_code

接下来,我们使用条件语句对不同的状态码进行处理。以常见的状态码为例,如果状态码为 200,则表示请求成功,我们打印出相应的成功信息。如果状态码为 404,则表示页面未找到,我们打印出相应的错误信息。如果状态码为 500,则表示服务器内部错误,同样打印出相应的错误信息。对于其他未预料到的状态码,我们打印出无法识别的状态码信息。

注意:状态码的具体含义可能根据不同的 HTTP 协议版本和服务器实现有所差异。因此,在实际应用中,可能需要参考相应的文档或规范来了解每个状态码的含义,并根据具体情况进行适当处理。


4 异常处理

requests 库提供了一套完善的异常处理机制,用于捕获和处理与网络请求相关的异常。当发生异常时,可以通过捕获 requests.exceptions.RequestException 异常来处理,并根据不同的异常类型进行相应的操作。

import requests
from requests.exceptions import RequestException
try:
    # 发送 GET 请求
    response = requests.get('https://api.example.com')
    # 检查响应状态码
    response.raise_for_status()
    # 处理响应数据
    data = response.json()
    print('Response data:', data)
except requests.exceptions.HTTPError as err:
    print('HTTP Error:', err)
except requests.exceptions.ConnectionError as err:
    print('Connection Error:', err)
except requests.exceptions.Timeout as err:
    print('Timeout Error:', err)
except requests.exceptions.RequestException as err:
    print('Error occurred:', err)

在上述示例代码中,我们首先尝试发送一个 GET 请求到 'https://api.example.com'。然后,使用 response.raise_for_status() 方法检查响应的状态码,如果状态码表明请求失败,将会抛出 requests.exceptions.HTTPError 异常。

try 语句块中,我们通过多个 except 子句来捕获和处理不同类型的异常。例如,如果发生连接错误(如网络连接问题、DNS 错误等),将抛出 requests.exceptions.ConnectionError 异常;如果发生超时错误,将抛出 requests.exceptions.Timeout 异常。

最后,我们使用 requests.exceptions.RequestException 来捕获其他的请求异常,这包括 HTTPErrorConnectionErrorTimeout 以及其他未明确定义的异常类型。在这个异常处理块中,可以打印出发生的异常信息,或者根据实际需求进行相应的错误处理。

注意:捕获 RequestException 异常将会捕获所有与请求相关的异常,因此它应该作为捕获异常的基类。如果你只想捕获特定类型的异常,可以将其放在更具体的子类异常之前。

通过合理的异常处理,可以增加代码的健壮性和可靠性,并提供有用的错误信息和反馈给用户。在实际使用中,可以根据具体的场景和需求,进一步处理异常、记录日志、重试请求或采取其他适当的措施。

相关文章
|
6月前
|
存储 缓存 安全
第二章 HTTP请求方法、状态码详解与缓存机制解析
第二章 HTTP请求方法、状态码详解与缓存机制解析
109 0
|
JSON 前端开发 数据格式
【前后端异常】http/https post请求 返回415错误状态码的解决方法
【前后端异常】http/https post请求 返回415错误状态码的解决方法
2974 0
|
JSON 前端开发 小程序
uniapp:request 请求出现400错误
uniapp:request 请求出现400错误
633 0
uniapp:request 请求出现400错误
|
API 对象存储 网络架构
OSS restful API 调用 put,上传文件,python发http request示例
发送put 请求,向bucket中写入文件,代码中*** 的部分改成实际内容。rest请求主要问题在拼header时authorization可能会有问题,注意生成signature时的入参。#tested env: python version v3.9.6 #author: Fred #2022-1-11 import hmac import hashlib import base64 im
1197 0
|
2月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
4月前
|
存储 运维 Java
函数计算产品使用问题之如何使用Python的requests库向HTTP服务器发送GET请求
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
104 8
|
6月前
|
JSON API 数据安全/隐私保护
如何使用Fastapi上传文件?先从请求体数据讲起
如何使用Fastapi上传文件?先从请求体数据讲起
187 2
|
6月前
|
JSON 数据格式 Python
如何使用 Python 中的`requests`库发送 HTTP 请求?
【2月更文挑战第21天】【2月更文挑战第66篇】如何使用 Python 中的`requests`库发送 HTTP 请求?
91 2
如何使用mitmproxy 修改http code
如何使用mitmproxy 修改http code
|
6月前
|
API Python
Python 工具和库:如何使用 requests 库发送 HTTP 请求?
Python 工具和库:如何使用 requests 库发送 HTTP 请求?
72 0