Flask request 对象用法
所属分类 python
浏览量 6
Flask request 对象 用于处理客户端发送的 HTTP 请求数据
1. 基本导入
from flask import Flask, request
2. 获取请求方法
@app.route('/api', methods=['GET', 'POST', 'PUT', 'DELETE'])
def handle_request():
method = request.method # 'GET', 'POST' 等
return f'请求方法: {method}'
3. 获取 URL 参数
GET 请求参数
@app.route('/search')
def search():
# 单个参数
keyword = request.args.get('keyword', '') # 获取keyword参数,默认空字符串
page = request.args.get('page', 1, type=int) # 指定类型
# 获取所有参数
all_args = request.args.to_dict()
# 检查参数是否存在
if 'keyword' in request.args:
# 处理逻辑
return f'搜索关键词: {keyword}, 页码: {page}'
4. 获取表单数据
@app.route('/login', methods=['POST'])
def login():
# 单个表单字段
username = request.form.get('username')
password = request.form.get('password')
# 获取所有表单数据
form_data = request.form.to_dict()
return f'用户名: {username}'
5. 获取 JSON 数据
@app.route('/api/users', methods=['POST'])
def create_user():
# 确保请求包含JSON
if not request.is_json:
return {'error': 'Content-Type必须是application/json'}, 400
# 获取JSON数据
data = request.get_json()
# 或者带默认值和强制解析
data = request.get_json(force=True) # 即使Content-Type不是JSON也强制解析
data = request.get_json(silent=True) # 解析失败返回None而不是报错
name = data.get('name')
age = data.get('age')
return {'message': '用户创建成功', 'data': data}
6. 获取文件上传
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['POST'])
def upload_file():
# 单个文件
file = request.files.get('file')
if file:
filename = secure_filename(file.filename)
file.save(f'uploads/{filename}')
# 多个同名文件
files = request.files.getlist('files') # 对于多文件上传
return '文件上传成功'
7. 获取请求头信息
@app.route('/headers')
def show_headers():
# 获取特定请求头
user_agent = request.headers.get('User-Agent')
content_type = request.headers.get('Content-Type')
# 获取所有请求头
all_headers = dict(request.headers)
return {'User-Agent': user_agent}
8. 获取 cookies
@app.route('/get-cookie')
def get_cookie():
user_id = request.cookies.get('user_id')
return f'User ID: {user_id}'
@app.route('/set-cookie')
def set_cookie():
resp = make_response('设置Cookie')
resp.set_cookie('user_id', '12345', max_age=3600)
return resp
9. 获取原始数据和其他属性
@app.route('/raw')
def raw_data():
# 获取原始数据
raw_data = request.data
# 获取查询字符串
query_string = request.query_string.decode('utf-8')
# 获取远程地址
remote_addr = request.remote_addr
# 获取路径
path = request.path
full_path = request.full_path
return {
'remote_addr': remote_addr,
'path': path,
'url': request.url
}
10. 综合示例
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/user', methods=['POST'])
def create_user():
# 检查内容类型
content_type = request.headers.get('Content-Type', '')
if 'application/json' in content_type:
data = request.get_json()
elif 'multipart/form-data' in content_type:
data = request.form.to_dict()
# 处理文件
if 'avatar' in request.files:
avatar = request.files['avatar']
# 保存文件逻辑
else:
return jsonify({'error': '不支持的Content-Type'}), 400
# 验证必要字段
required_fields = ['username', 'email']
for field in required_fields:
if field not in data:
return jsonify({'error': f'缺少必要字段: {field}'}), 400
# 处理数据...
return jsonify({'message': '用户创建成功', 'data': data}), 201
if __name__ == '__main__':
app.run(debug=True)
11. 请求钩子(Hook)
@app.before_request
def before_request():
"""每个请求前执行"""
if request.method == 'POST':
# 验证请求大小
if request.content_length and request.content_length > 1024 * 1024: # 1MB
return '文件太大', 413
@app.after_request
def after_request(response):
"""每个请求后执行"""
response.headers['X-Frame-Options'] = 'SAMEORIGIN'
return response
12. 获取请求的 MIME 类型
@app.route('/process', methods=['POST'])
def process():
# 获取请求的MIME类型
mimetype = request.mimetype
preferred = request.accept_mimetypes.best
# 根据不同类型处理
if request.is_json:
# 处理JSON
pass
elif request.is_form:
# 处理表单
pass
return f'MIME类型: {mimetype}'
注意事项
线程安全:request 对象是线程局部变量,每个请求都有自己的 request 对象
编码:默认使用 UTF-8 编码
大小限制:注意文件上传大小限制,可通过配置调整
安全性:始终验证和清理用户输入
类型转换:使用 type 参数确保数据类型的正确性
# 配置示例
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 限制为16MB
app.config['JSON_AS_ASCII'] = False # 支持中文
>>> import json
>>> json.dumps('老虎', ensure_ascii=False)
'"老虎"'
>>> json.dumps('老虎', ensure_ascii=True)
'"\\u8001\\u864e"'
from flask import Flask, request, jsonify,Response
import json
# 2. 查询所有用户(GET)
@app.route('/api/users', methods=['GET'])
def get_all_users():
# 把字典值转为列表(模拟查询所有数据)
user_list = list(fake_db.values())
# return jsonify({'users': user_list})
return Response(
json.dumps({'users': user_list}, ensure_ascii=False), # 禁用 ASCII 转义
content_type='application/json; charset=utf-8' # 明确指定编码
)
基于内存字典 用户增删改查例子
https://gitee.com/dyyx/work2024/blob/master/docs/q/py/blogdemo/blog_dict.py
flask例子 网页和rest api接口
https://gitee.com/dyyx/work2024/tree/master/myquant/python/flaskdemo
上一篇
quantstats 简介及使用例子
QLib核心概念和术语
量化python库