Flask请求对象:获取用户输入与参数

在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-datax-www-form-urlencoded,填写usernamepassword参数。

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数据,返回数据的长度。

通过这些练习,你就能更熟练地处理用户输入和参数啦!

小夜