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)
本文来自博客园,作者:Fēngwèi,转载请注明原文链接:https://www.cnblogs.com/fengwei-blogs/p/21299956

浙公网安备 33010602011771号