Flask请求数据获取方法详解

Flask提供了多种方式来获取客户端发送的请求数据,包括表单数据、JSON数据、查询参数、文件上传等。下面详细介绍各种获取请求数据的方法。

图片[1]_Flask请求数据获取方法详解_知途无界

1. 获取查询参数(Query String)

查询参数是URL中?后面的部分,如/search?q=flask&page=2

from flask import Flask, request

app = Flask(__name__)

@app.route('/search')
def search():
    # 获取单个参数
    query = request.args.get('q')  # 返回None如果不存在

    # 获取多个值(如复选框)
    tags = request.args.getlist('tags')  # 返回列表

    # 获取所有参数(返回ImmutableMultiDict)
    all_args = request.args

    return f"Query: {query}, Tags: {tags}"

2. 获取表单数据(Form Data)

适用于application/x-www-form-urlencodedmultipart/form-data(文件上传)的POST请求。

@app.route('/login', methods=['POST'])
def login():
    # 获取单个字段
    username = request.form.get('username')
    password = request.form.get('password')

    # 获取所有字段(返回ImmutableMultiDict)
    all_forms = request.form

    # 获取多个值
    hobbies = request.form.getlist('hobbies')

    return f"Username: {username}, Password: {password}"

3. 获取JSON数据

适用于Content-Type: application/json的请求。

@app.route('/api/data', methods=['POST'])
def get_json_data():
    # 获取JSON数据
    data = request.get_json()  # 返回Python字典或None

    if not data:
        return "No JSON data received", 400

    name = data.get('name')
    age = data.get('age')

    return f"Name: {name}, Age: {age}"

4. 获取文件上传

通过multipart/form-data上传文件。

from werkzeug.utils import secure_filename
import os

UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}

app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return "No file part", 400

    file = request.files['file']

    if file.filename == '':
        return "No selected file", 400

    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        return f"File {filename} uploaded successfully"

    return "File type not allowed", 400

5. 获取请求头信息

@app.route('/headers')
def get_headers():
    # 获取单个头
    user_agent = request.headers.get('User-Agent')

    # 获取所有头(返回ImmutableMultiDict)
    all_headers = request.headers

    return f"User-Agent: {user_agent}"

6. 获取Cookie

@app.route('/cookie')
def get_cookie():
    # 获取单个cookie
    session_id = request.cookies.get('session_id')

    # 获取所有cookie(返回字典)
    all_cookies = request.cookies

    return f"Session ID: {session_id}"

7. 获取路径参数

@app.route('/user/<int:user_id>')
def get_user(user_id):
    return f"User ID: {user_id}"

8. 获取请求方法

@app.route('/method', methods=['GET', 'POST'])
def get_method():
    method = request.method
    return f"Request method: {method}"

9. 获取远程地址

@app.route('/ip')
def get_ip():
    ip = request.remote_addr
    return f"Your IP address is: {ip}"

10. 获取请求体(原始数据)

对于非JSON的原始数据:

@app.route('/raw-data', methods=['POST'])
def raw_data():
    data = request.get_data()  # 返回bytes
    return f"Raw data: {data.decode('utf-8')}"

11. 获取请求内容类型

@app.route('/content-type')
def content_type():
    content_type = request.content_type
    return f"Content-Type: {content_type}"

12. 获取请求路径和URL

@app.route('/path-info')
def path_info():
    path = request.path  # 不包含查询参数
    full_url = request.url  # 完整URL
    return f"Path: {path}, Full URL: {full_url}"

最佳实践

  1. 始终检查请求方法:使用methods参数限制允许的HTTP方法
  2. 验证输入数据:对所有输入数据进行验证和清理
  3. 处理错误情况:检查数据是否存在,提供有意义的错误信息
  4. 使用适当的Content-Type:客户端和服务器应协商一致的Content-Type
  5. 大文件处理:对于大文件上传,考虑流式处理或分块上传

完整示例

from flask import Flask, request, jsonify
import os
from werkzeug.utils import secure_filename

app = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# 允许的文件扩展名
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/api/user', methods=['POST'])
def create_user():
    # 获取JSON数据
    data = request.get_json()

    if not data:
        return jsonify({"error": "No JSON data provided"}), 400

    # 获取并验证数据
    name = data.get('name')
    age = data.get('age')

    if not name:
        return jsonify({"error": "Name is required"}), 400

    if age is not None and (not isinstance(age, int) or age < 0):
        return jsonify({"error": "Age must be a positive integer"}), 400

    # 处理文件上传(如果有)
    file = None
    if 'avatar' in request.files:
        file = request.files['avatar']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

    # 返回响应
    response = {
        "message": "User created successfully",
        "name": name,
        "age": age
    }

    if file:
        response["avatar"] = filename

    return jsonify(response), 201

if __name__ == '__main__':
    if not os.path.exists(UPLOAD_FOLDER):
        os.makedirs(UPLOAD_FOLDER)
    app.run(debug=True)

通过掌握这些方法,你可以灵活地处理Flask应用中的各种请求数据。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞74 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容