Flask提供了多种方式来获取客户端发送的请求数据,包括表单数据、JSON数据、查询参数、文件上传等。下面详细介绍各种获取请求数据的方法。
![图片[1]_Flask请求数据获取方法详解_知途无界](https://zhituwujie.com/wp-content/uploads/2025/04/d2b5ca33bd20250427095459.png)
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-urlencoded或multipart/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}"
最佳实践
- 始终检查请求方法:使用
methods参数限制允许的HTTP方法 - 验证输入数据:对所有输入数据进行验证和清理
- 处理错误情况:检查数据是否存在,提供有意义的错误信息
- 使用适当的Content-Type:客户端和服务器应协商一致的Content-Type
- 大文件处理:对于大文件上传,考虑流式处理或分块上传
完整示例
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

























暂无评论内容