Python-模块篇(网络与Web篇)

1、HTTP客户端-requests

requests模块是Python中用于发送HTTP请求的强大工具,简化了与Web服务器的交互过程。

安装:pip install requests

1.1  发送请求

GET 请求(最常用)
import requests

# 基础GET
resp = requests.get("https://httpbin.org/get")

# 带查询参数(自动拼接到URL)
params = {"page": 1, "size": 10, "keyword": "python"}
resp = requests.get(url="https://httpbin.org/get", params=params, timeout=30)
print(resp.url)  # https://httpbin.org/get?page=1&size=10&keyword=python

# 带请求头(模拟浏览器/携带Token,Set-Cookie能配置cookie-识别用户身份)
headers = {
    "User-Agent": "Mozilla/5.0",
    "Authorization": "Bearer your_token_here"
}

# 带额外的cookies
cookies = {
    ".Cnblogs.AspNetCore.Cookies": "H39iaX9Dkx4sI5iyMHbGcFYHXxF7DaucPuxf8iR2x_"
}
resp = requests.get(url="https://api.example.com/data", headers=headers, timeout=30, cookies=cookies)
POST 请求(提交数据)
import requests

# 方式1:提交JSON(最常用,RESTful API)
json_data = {"username": "test", "password": "123456"}
resp = requests.post("https://httpbin.org/post", json=json_data)
# 实际发送 {"username": "test", "password": "123456"}
# Content-Type:application/json,数据格式为JSON 格式
# 自动调用 json.dumps() 完成转换(dict转换为json)

# 方式2:提交表单(application/x-www-form-urlencoded)
form_data = {"key1": "value1", "key2": "value2"}
resp = requests.post("https://httpbin.org/post", data=form_data)
# 实际发送 username=test&password=123456
# Content-Type:application/x-www-form-urlencoded、数据格式为表单格式(键值对)

# 方式3:上传文件
files = {"file": open("test.txt", "rb")}
resp = requests.post("https://httpbin.org/post", files=files)
PUT / DELETE / PATCH
# PUT(更新整个资源)
resp = requests.put("https://api.example.com/user/1", json={"name": "new_name"})

# DELETE(删除资源)
resp = requests.delete("https://api.example.com/user/1")

# PATCH(部分更新)
resp = requests.patch("https://api.example.com/user/1", json={"age": 30})

1.2 处理响应

import requests

resp = requests.get("https://httpbin.org/get")

# 1. 状态码
print(resp.status_code)          # 200
print(resp.ok)                   # True(状态码<400)

# 2. 响应体(3种格式)
print(resp.text)                 # 字符串格式(HTML/XML)
print(resp.json())               # 把JSON自动解析为字典(最常用)
print(resp.content)              # 字节格式(下载图片/文件)

# 3. 响应头
print(resp.headers)              # 所有响应头
print(resp.headers.get("Content-Type"))  # 获取特定头

# 4. Cookies
print(resp.cookies)              # 获取服务端设置的Cookie
print(resp.cookies.get("session_id"))

# 5. 响应时间(性能测试用)
print(resp.elapsed.total_seconds())# 请求耗时(秒)

1.3 常用技巧

Session对象(保持登录)
场景:先登录获取token/cookie,后续请求自动携带
import requests

# 创建Session(自动管理Cookie)
session = requests.Session()

# 第一步:登录(获取token/cookie)
login_data = {"username": "admin", "password": "123456"}
login_resp = session.post("https://httpbin.org/post", json=login_data)
token = login_resp.json().get("token")

# 第二步:设置全局请求头(所有请求自动携带)
session.headers.update({
    "Authorization": f"Bearer {token}",
    "User-Agent": "MyTestApp/1.0"
})

# 第三步:后续请求自动携带认证信息
resp = session.get("https://httpbin.org/get")
print(resp.json())  # 请求头中会自动包含Authorization

# 第四步:登出(清除Session)
session.cookies.clear()
session.headers.clear()
异常处理
import requests
from requests.exceptions import RequestException, Timeout, ConnectionError

try:
    resp = requests.get("https://httpbin.org/delay/3", timeout=2) #超时2秒
    resp.raise_for_status()  # 状态码大于400则抛出异常
except Timeout:
    print("请求超时,请检查网络或增加超时时间")
except ConnectionError:
    print("连接失败,服务可能不可用")
except RequestException as e:
    print(f"请求异常: {e}")
else:
    print("请求成功", resp.json())
证书验证
import requests,urllib3

urllib3.disable_warnings() #禁用警告

# 跳过SSL验证(测试环境)
resp = requests.get("https://self-signed.badssl.com", verify=False)

# 使用自定义证书
resp = requests.get("https://api.example.com", verify="/path/to/cert.pem")
代理设置(抓包调试)
proxies = {
    "http": "http://127.0.0.1:8888",   # Charles/Fiddler
    "https": "http://127.0.0.1:8888",
}
resp = request.get("https://api.example.com", proxies=proxies)

2、Web框架-Flask

Flask 是一个用 Python 编写的轻量级 Web 应用框架,用于快速写出网站、接口、后台服务。

安装:pip install Flask

第一个应用

from flask import Flask

app = Flask(__name__) #创建了一个 Flask 应用实例

@app.route('/')  #定义访问'/'时触发的函数
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True) 

#启动Flask服务器,debug=True表示代码改变时自动重新加载
#访问:http://127.0.0.1:5000/,输出'Hello, World!'

查询用户 

from flask import Flask, jsonify

app = Flask(__name__)

app.config['JSON_AS_ASCII'] = False  # 关闭ASCII转义,避免将中文转义为Unicode

# GET接口:返回用户信息
@app.route('/user/<int:user_id>', methods=['GET'])
def get_user(user_id):
    return jsonify({ #jsonify():把字典或列表转换为json响应
        "id": user_id,
        "name": f"用户{user_id}",
        "email": f"user{user_id}@test.com"
    })

# POST接口:创建用户
@app.route('/user', methods=['POST'])
def create_user():
    return jsonify({
        "code": 0,
        "message": "创建成功",
        "user_id": 12345
    }), 201  # 201是状态码

# 启动服务
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

#访问:http://localhost:5000/user/1
"""
{
  "email": "user1@test.com", 
  "id": 1, 
  "name": "用户1"
}
"""
 

 请求对象-request(可获取所有的请求信息)

from flask import Flask, request, jsonify

app = Flask(__name__)

# 获取JSON请求体(最常用),{"key": "value"}
@app.route('/api/json', methods=['POST'])
def handle_json():
    data = request.get_json()  # 自动解析JSON为字典
    print(f"收到数据: {data}")
    return jsonify({"received": data})

# 获取 URL 参数(GET)
@app.route('/api/search', methods=['GET'])
def handle_query():
    keyword = request.args.get('keyword', '')  # 第二个参数是默认值
    page = request.args.get('page', 1, type=int)
    return jsonify({"keyword": keyword, "page": page})

# 获取表单数据,key=value&key2=value2
@app.route('/api/form', methods=['POST'])
def handle_form():
    username = request.form.get('username')
    password = request.form.get('password')
    return jsonify({"username": username})

# 获取请求头
@app.route('/api/headers', methods=['GET'])
def handle_headers():
    auth = request.headers.get('Authorization')
    return jsonify({"auth_header": auth})

1、make_response-手动控制响应

# 返回任意状态码 + 响应头
@app.route('/custom')
def custom():
    resp = make_response(jsonify({"msg": "自定义响应"}))
    resp.status_code = 201
    resp.headers['X-Custom-Header'] = 'test_value'
    resp.set_cookie('session_id', 'abc123')
    return resp

2、高级Mock技巧

time.sleep(2)  # 模拟慢接口
if random.random() < 0.3:  # 模拟随机异常,30%概率失败
    return jsonify({"error": "服务暂时不可用"}), 503

#跨域支持(前后端联调时,跨域问题很常见,需开启CORS支持跨域访问)
from flask_cors import CORS

app = Flask(__name__)
CORS(app)  # 允许所有域访问
 

2.1 万能Mock接口

# 一个Mock服务模板(拷贝即用)
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/mock/<path:endpoint>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def mock_all(endpoint):
    """万能Mock接口"""
    return jsonify({
        "code": 0,
        "message": "Mock成功",
        "data": {
            "endpoint": f"/mock/{endpoint}",
            "method": request.method,
            "headers": dict(request.headers),
            "params": dict(request.args),
            "body": request.get_json() if request.is_json else None
        }
    })

if __name__ == '__main__':
    app.run(debug=True, port=5000)

 

posted @ 2026-07-09 17:36  Fēngwèi  阅读(4)  评论(0)    收藏  举报