Python实现Web请求与响应

Python实现Web请求与响应

在 Web 开发中,请求(Request)响应(Response) 是客户端与服务器之间通信的核心机制,基于 HTTP(Hypertext Transfer Protocol)协议实现。以下是详细解析:

一、Web 请求(Web Request)

定义

客户端(如浏览器、手机 App)向服务器发送的数据获取或操作请求,本质是符合 HTTP 协议格式的数据包。

核心组成部分
  1. 请求行(Request Line)

    • 请求方法

      :指定操作类型,常见包括:

      • GET:获取资源(如网页、图片)
      • POST:提交数据(如表单提交)
      • PUT:更新资源
      • DELETE:删除资源
      • HEAD:获取资源头部信息
    • 请求 URL:资源地址,如 https://example.com/api/user

    • HTTP 版本:如 HTTP/1.1

  2. 请求头(Request Headers)
    包含客户端信息和请求附加参数,常见字段:

    • User-Agent:客户端类型(如浏览器型号)
    • Content-Type:请求体数据格式(如 application/json
    • Cookie:携带服务器之前设置的 Cookie
    • Authorization:身份认证信息(如 Token)
  3. 请求体(Request Body)
    仅在POSTPUT等方法中存在,包含发送给服务器的数据,例如:

    • 表单数据: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 协议格式。

核心组成部分
  1. 状态行(Status Line)

    • HTTP 版本:如 HTTP/1.1

    • 状态码

      :表示请求处理结果,常见包括:

      • 200 OK:请求成功
      • 404 Not Found:资源不存在
      • 403 Forbidden:权限拒绝
      • 500 Internal Server Error:服务器内部错误
    • 状态消息:对状态码的文本描述(如 OK

  2. 响应头(Response Headers)
    包含服务器信息和响应附加参数,常见字段:

    • Content-Type:响应体数据格式(如 text/html
    • Content-Length:响应体字节长度
    • Set-Cookie:设置客户端 Cookie
    • Cache-Control:缓存策略
  3. 响应体(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):每个请求和响应都是独立的,服务器不自动记录客户端的历史交互。
  • 为什么需要无状态?
    减轻服务器负担,适合高并发场景(无需维护每个客户端的状态数据)。
  • 如何解决无状态的局限性?
    通过CookieSessionToken等机制手动维护状态(例如登录状态)。

四、请求 - 响应流程示例(浏览器访问网页)

  1. 客户端发起请求
    浏览器解析 URL,生成GET请求并发送给服务器。
  2. 服务器处理请求
    • 解析请求方法和 URL,确定需要返回的资源(如 HTML 文件)。
    • 读取资源内容,封装成响应(状态码 200 + 响应头 + HTML 内容)。
  3. 服务器返回响应
    将数据通过网络传输给浏览器。
  4. 客户端处理响应
    浏览器解析 HTML 内容,渲染出网页。

五、常见应用场景

  • 前端与后端交互:前端通过fetchaxios等工具发送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 库。
  • installpip的子命令,表示安装操作。
  • 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)
主要参数说明
  1. file(必需)
    • 文件路径(绝对或相对路径)
    • 可以是字符串、字节对象或 os.PathLike 对象
  2. mode(可选)
    • 'r':只读模式(默认)
    • 'w':写入模式(覆盖现有文件)
    • 'a':追加模式(在文件末尾添加内容)
    • 'x':独占创建模式(创建新文件,若文件已存在则报错)
    • 'b':二进制模式(与其他模式组合使用,如 'rb'
    • 't':文本模式(默认,与其他模式组合使用,如 'rt'
    • '+':读写模式(与其他模式组合使用,如 'r+'
  3. encoding(可选)
    • 指定文件编码(仅在文本模式下使用)
    • 常见编码:'utf-8''ascii''latin-1'
    • 默认编码取决于系统(通常是 locale.getpreferredencoding(False)
  4. 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}")
最佳实践
  1. 使用 with 语句:自动管理文件的打开和关闭,避免资源泄漏
  2. 指定编码:始终明确指定文件编码,避免平台差异导致的问题
  3. 异常处理:处理可能的文件操作异常
  4. 使用二进制模式处理非文本文件:如图片、音频等
  5. 按需读取:大文件应逐行读取,避免一次性加载到内存

open() 是 Python 文件操作的基础,掌握其用法对于文件处理、数据持久化等任务至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值