首页  

Flask request 对象用法     所属分类 python 浏览量 12
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库