Python实现Web请求与响应
在 Web 开发中,请求(Request) 和响应(Response) 是客户端与服务器之间通信的核心机制,基于 HTTP(Hypertext Transfer Protocol)协议实现。以下是详细解析:
一、Web 请求(Web Request)
定义
客户端(如浏览器、手机 App)向服务器发送的数据获取或操作请求,本质是符合 HTTP 协议格式的数据包。
核心组成部分
-
请求行(Request Line)
-
请求方法
:指定操作类型,常见包括:
GET
:获取资源(如网页、图片)POST
:提交数据(如表单提交)PUT
:更新资源DELETE
:删除资源HEAD
:获取资源头部信息
-
请求 URL:资源地址,如
https://example.com/api/user
-
HTTP 版本:如
HTTP/1.1
-
-
请求头(Request Headers)
包含客户端信息和请求附加参数,常见字段:User-Agent
:客户端类型(如浏览器型号)Content-Type
:请求体数据格式(如application/json
)Cookie
:携带服务器之前设置的 CookieAuthorization
:身份认证信息(如 Token)
-
请求体(Request Body)
仅在POST
、PUT
等方法中存在,包含发送给服务器的数据,例如:- 表单数据:
name=Alice&age=25
- JSON 数据:
{"username": "bob", "password": "123"}
- 表单数据:
示例(通过浏览器访问网页时的请求)
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows)
Accept: text/html,application/xhtml+xml
二、Web 响应(Web Response)
定义
服务器接收到请求后,处理并返回给客户端的结果数据,同样遵循 HTTP 协议格式。
核心组成部分
-
状态行(Status Line)
-
HTTP 版本:如
HTTP/1.1
-
状态码
:表示请求处理结果,常见包括:
200 OK
:请求成功404 Not Found
:资源不存在403 Forbidden
:权限拒绝500 Internal Server Error
:服务器内部错误
-
状态消息:对状态码的文本描述(如
OK
)
-
-
响应头(Response Headers)
包含服务器信息和响应附加参数,常见字段:Content-Type
:响应体数据格式(如text/html
)Content-Length
:响应体字节长度Set-Cookie
:设置客户端 CookieCache-Control
:缓存策略
-
响应体(Response Body)
服务器返回的具体数据,例如:- HTML 页面内容(浏览器请求时)
- JSON 格式的 API 数据(如
{"code": 200, "data": [...]}
) - 图片、视频等二进制数据
示例(服务器返回的响应)
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Server: Apache/2.4
<!DOCTYPE html>
<html>
<body>Hello, World!</body>
</html>
三、HTTP 协议的无状态特性
- 无状态(Stateless):每个请求和响应都是独立的,服务器不自动记录客户端的历史交互。
- 为什么需要无状态?
减轻服务器负担,适合高并发场景(无需维护每个客户端的状态数据)。 - 如何解决无状态的局限性?
通过Cookie
、Session
、Token
等机制手动维护状态(例如登录状态)。
四、请求 - 响应流程示例(浏览器访问网页)
- 客户端发起请求
浏览器解析 URL,生成GET
请求并发送给服务器。 - 服务器处理请求
- 解析请求方法和 URL,确定需要返回的资源(如 HTML 文件)。
- 读取资源内容,封装成响应(状态码 200 + 响应头 + HTML 内容)。
- 服务器返回响应
将数据通过网络传输给浏览器。 - 客户端处理响应
浏览器解析 HTML 内容,渲染出网页。
五、常见应用场景
- 前端与后端交互:前端通过
fetch
、axios
等工具发送API请求
,后端返回 JSON 数据。 - 表单提交:用户填写表单后,浏览器以
POST
请求发送数据到服务器。 - 文件下载:客户端发送
GET
请求,服务器返回文件数据(如 PDF、图片)。
六、相关扩展协议
- HTTPS:在 HTTP 基础上添加 TLS/SSL 加密,保证数据传输安全。
- HTTP/2:相比 HTTP/1.1,支持多路复用、头部压缩等优化,提升性能。
- WebSocket:基于 HTTP 握手,建立双向持久连接(非传统请求 - 响应模式)。
web
在openeuler中安装python
# 配置pip3使用阿里云的Python包镜像源,加速国内下载速度
[root@localhost ~]# pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
# 将阿里云镜像源域名添加到可信主机列表,避免因HTTPS证书问题导致的警告
[root@localhost ~]# pip3 config set install.trusted-host mirrors.aliyun.com
# 使用配置好的镜像源升级pip3自身到最新版本
[root@localhost ~]# pip3 install --upgrade pip
安装requests库
pip install requests
pip
:Python 的包管理工具,负责安装、升级、卸载 Python 库。install
:pip
的子命令,表示安装操作。requests
:要安装的库名称,这里指 Python 的 HTTP 客户端库。
发送get请求
import requests
# 发送GET请求到指定URL,返回Response对象
response = requests.get('https://httpbin.org/get')
# 响应状态码:200表示成功,404表示未找到,500表示服务器错误
print(response.status_code) # 输出: 200
# 响应内容的文本形式(字符串)
print(response.text) # 输出: 返回的HTML/JSON/文本内容
# 响应头信息(字典形式)
print(response.headers) # 输出: {'Content-Type': 'application/json', ...}
# 响应内容的长度(字符数)
print(len(response.text)) # 输出: 响应文本的长度
发送post请求
import requests
url = 'https://www.httpbin.org/post'
# 使用正确的字典格式
data = {'id': 1, 'age': 99} # 或 {'id:1', 'age:99'} 作为表单数据
response = requests.post(url, data=data)
# 正确的属性名
print('Response Body:', response.json())
处理json响应
import requests # 导入requests库,用于发送HTTP请求
# 设置GitHub API的URL,获取用户octocat的信息
url = 'https://api.github.com/users/octocat'
# 发送GET请求到GitHub API
response = requests.get(url)
# 将响应内容解析为JSON格式(字典)
data = response.json()
# 打印用户的登录名(GitHub用户名)
print('user login:', data['login']) # 输出: user login: octocat
# 打印用户的真实姓名
print('User Name:', data['name']) # 输出: User Name: The Octocat
Python 内置函数 open()
详解
open()
是 Python 中用于文件操作的核心内置函数,它提供了读写文件的基本接口。下面详细介绍其功能、参数和用法:
基本语法
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
主要参数说明
file
(必需)- 文件路径(绝对或相对路径)
- 可以是字符串、字节对象或
os.PathLike
对象
mode
(可选)'r'
:只读模式(默认)'w'
:写入模式(覆盖现有文件)'a'
:追加模式(在文件末尾添加内容)'x'
:独占创建模式(创建新文件,若文件已存在则报错)'b'
:二进制模式(与其他模式组合使用,如'rb'
)'t'
:文本模式(默认,与其他模式组合使用,如'rt'
)'+'
:读写模式(与其他模式组合使用,如'r+'
)
encoding
(可选)- 指定文件编码(仅在文本模式下使用)
- 常见编码:
'utf-8'
、'ascii'
、'latin-1'
等 - 默认编码取决于系统(通常是
locale.getpreferredencoding(False)
)
errors
(可选)- 编码错误处理方式
- 常见值:
'strict'
(默认,抛出异常)、'ignore'
、'replace'
等
返回值
open()
返回一个文件对象(file object),也称为文件句柄。常见的文件对象方法包括:
read()
:读取文件内容write()
:写入文件内容close()
:关闭文件readline()
:读取一行readlines()
:读取所有行并返回列表tell()
:返回当前文件位置seek()
:移动文件指针位置
文件模式组合示例
模式 | 描述 |
---|---|
'r' | 只读模式,文件必须存在 |
'w' | 写入模式,创建新文件或覆盖现有文件 |
'a' | 追加模式,创建新文件或在现有文件末尾添加内容 |
'x' | 独占创建模式,创建新文件,若文件已存在则报错 |
'rb' | 二进制只读模式 |
'wb' | 二进制写入模式 |
'r+' | 读写模式,从文件开头开始 |
'w+' | 读写模式,创建新文件或覆盖现有文件 |
'a+' | 读写模式,创建新文件或在现有文件末尾添加内容 |
示例代码open()
# 1. 读取文件(文本模式)
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read() # 读取整个文件
print(content)
# 2. 写入文件(覆盖模式)
with open('example.txt', 'w', encoding='utf-8') as file:
file.write('Hello, World!\n') # 写入内容
file.write('This is a new line.\n') # 继续写入
# 3. 追加内容到文件
with open('example.txt', 'a', encoding='utf-8') as file:
file.write('This line is appended.\n') # 追加内容
# 4. 读取文件的每一行
with open('example.txt', 'r', encoding='utf-8') as file:
for line in file: # 逐行读取(内存高效)
print(line.strip()) # 移除行尾的换行符
# 5. 读取所有行到列表
with open('example.txt', 'r', encoding='utf-8') as file:
lines = file.readlines() # 读取所有行到列表
for line in lines:
print(line.strip())
# 6. 二进制文件读取(如图像)
with open('image.jpg', 'rb') as file:
binary_data = file.read() # 读取二进制数据
# 7. 二进制文件写入
with open('new_image.jpg', 'wb') as file:
file.write(binary_data) # 写入二进制数据
# 8. 读写模式
with open('example.txt', 'r+', encoding='utf-8') as file:
content = file.read() # 读取内容
file.write('This is added after reading.\n') # 写入内容(从文件末尾开始)
# 9. 安全处理文件(自动关闭)
try:
file = open('example.txt', 'r')
content = file.read()
# 处理内容
finally:
file.close() # 确保文件关闭(即使发生异常)
# 10. 使用 with 语句(更简洁的自动关闭方式)
with open('example.txt', 'r') as file:
content = file.read()
# 文件在 with 块结束时自动关闭
文件指针操作
文件对象维护一个内部指针,指示当前读写位置:
with open('example.txt', 'r+') as file:
print(file.read(5)) # 读取前5个字符
print(file.tell()) # 显示当前位置(5)
file.seek(0) # 回到文件开头
print(file.read(3)) # 再次读取前3个字符
异常处理
文件操作可能引发多种异常,如文件不存在、权限错误等:
try:
with open('nonexistent.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("文件不存在")
except PermissionError:
print("没有权限访问文件")
except Exception as e:
print(f"发生其他错误: {e}")
最佳实践
- 使用
with
语句:自动管理文件的打开和关闭,避免资源泄漏 - 指定编码:始终明确指定文件编码,避免平台差异导致的问题
- 异常处理:处理可能的文件操作异常
- 使用二进制模式处理非文本文件:如图片、音频等
- 按需读取:大文件应逐行读取,避免一次性加载到内存
open()
是 Python 文件操作的基础,掌握其用法对于文件处理、数据持久化等任务至关重要。