在Flask中,当用户访问我们的应用时,会发送各种请求(比如GET、POST等),而我们需要获取用户在请求中传递的参数和数据,这时候就需要用到请求对象。Flask通过request对象帮我们封装了这些信息,让我们可以轻松获取用户输入的内容。
1. 导入请求对象¶
首先,我们需要从Flask中导入request对象。在你的Flask应用文件(比如app.py)中,开头部分通常会有:
from flask import Flask, request
app = Flask(__name__)
这样我们就可以在路由函数中使用request来处理请求数据了。
2. 获取查询字符串参数(URL参数)¶
当用户通过URL的查询字符串传递参数时(比如/hello?name=Alice&age=18),这些参数会被放在查询字符串中,Flask通过request.args来获取。
示例:获取GET请求的查询参数¶
@app.route('/hello')
def hello():
# 获取查询参数中的name,默认值为"Guest"
name = request.args.get('name', 'Guest')
# 获取年龄,指定类型为整数,默认值为0
age = request.args.get('age', 0, type=int)
return f"Hello, {name}! You are {age} years old."
此时,当用户访问/hello?name=Bob&age=20时,页面会返回Hello, Bob! You are 20 years old.。
request.args是一个类似字典的对象,存储了所有查询参数。- 使用
get('参数名')获取参数,第二个参数是默认值(参数不存在时返回)。 - 通过
type=int可以指定参数类型(如数字),如果参数不存在或类型错误,会返回默认值。
3. 获取表单数据(POST请求)¶
当用户通过HTML表单(如登录表单)提交数据时,通常使用POST请求。这时候需要在路由中指定methods=['POST'],并通过request.form获取表单数据。
示例:处理POST表单提交¶
@app.route('/login', methods=['POST'])
def login():
# 获取表单中的用户名和密码
username = request.form.get('username')
password = request.form.get('password')
if username and password:
return f"Login successful! Welcome, {username}."
else:
return "Please fill in all fields.", 400 # 返回400错误码
此时,前端需要以application/x-www-form-urlencoded格式提交数据(这是HTML表单的默认格式)。比如用Postman模拟POST请求,在Body中选择form-data或x-www-form-urlencoded,填写username和password参数。
4. 获取JSON数据(POST请求)¶
如果用户通过POST请求发送JSON格式的数据(比如前端用JavaScript的fetch发送JSON),需要使用request.get_json()来获取。
示例:处理JSON数据¶
@app.route('/add_user', methods=['POST'])
def add_user():
# 检查是否是JSON请求
if not request.is_json:
return "Request must be JSON", 415 # 415表示不支持的媒体类型
# 获取JSON数据
data = request.get_json()
username = data.get('username')
age = data.get('age')
if username and age:
return f"User {username} added. Age: {age}"
else:
return "Missing username or age", 400
此时,前端发送的JSON应该类似:
{
"username": "Charlie",
"age": 22
}
request.is_json用于判断请求是否是JSON格式。request.get_json()会返回解析后的Python字典,如果请求不是JSON,会返回None。- 可以设置
request.get_json(force=True)强制解析,即使Content-Type不是application/json(但不推荐,可能导致错误)。
5. 总结关键点¶
- 查询字符串(GET参数):用
request.args,对应URL中的?后参数。 - 表单数据(POST):用
request.form,注意路由需指定methods=['POST']。 - JSON数据(POST):用
request.get_json(),需先判断是否是JSON(request.is_json)。 - 使用
get()方法时,尽量提供默认值,避免None导致错误。 request对象还有其他属性(如request.method获取请求方法,request.headers获取请求头),但获取参数时常用以上方法。
小练习¶
尝试修改上面的示例,比如:
1. 写一个路由,获取URL中的id参数并返回其平方(注意类型转换)。
2. 写一个POST路由,接收JSON数据,返回数据的长度。
通过这些练习,你就能更熟练地处理用户输入和参数啦!