轻松学Flask:请求与响应对象详解

在Web开发中,请求响应是两个核心概念。简单来说,请求是客户端(比如浏览器)发给Flask应用的数据,而响应是Flask应用返回给客户端的结果。理解这两个对象,是掌握Flask开发的基础。

一、请求对象:从客户端获取数据

当用户在浏览器中访问一个Flask路由时,浏览器会向Flask应用发送一个请求。Flask通过request对象来封装这些请求数据,我们可以通过它获取用户输入、请求方法、URL参数等信息。

1. 导入请求对象

要使用request对象,首先需要从flask模块中导入它:

from flask import Flask, request

2. 请求对象的核心属性

request对象包含了客户端发送的几乎所有信息,常用的核心属性如下:

属性/方法 作用描述
request.method 获取请求方法(如GETPOSTPUT等),大写字符串
request.args 获取URL参数(对应GET请求,如http://example.com/?name=test中的name
request.form 获取表单数据(对应POST请求,如HTML表单提交的数据)
request.cookies 获取客户端发送的Cookie信息
request.headers 获取请求头信息(如User-Agent、Content-Type等)

3. 示例:处理GET和POST请求

app = Flask(__name__)

@app.route('/')
def index():
    # 处理GET请求(URL参数)
    name = request.args.get('name', 'Guest')  # 获取name参数,默认值为'Guest'
    return f"Hello, {name}!这是GET请求的响应"

@app.route('/submit', methods=['POST'])
def submit():
    # 处理POST请求(表单数据)
    username = request.form.get('username')
    password = request.form.get('password')
    if username and password:
        return f"提交成功!用户名:{username}"
    else:
        return "用户名或密码不能为空", 400  # 返回400状态码(参数错误)

if __name__ == '__main__':
    app.run(debug=True)

测试方式
- 访问http://localhost:5000/?name=小明,会返回“Hello, 小明!这是GET请求的响应”
- 通过POST表单提交数据(如用Postman或HTML表单),发送username=testpassword=123,会返回“提交成功!用户名:test”

二、响应对象:给客户端返回结果

当Flask处理完请求后,需要通过响应对象将结果返回给客户端。Flask的响应对象可以是字符串、HTML页面、JSON数据、重定向等。

1. 直接返回字符串

最简单的响应方式,Flask会自动将字符串封装为状态码为200(成功)的响应:

@app.route('/hello')
def hello():
    return "Hello, Flask!"  # 状态码默认200

2. 返回HTML页面

如果需要返回HTML页面,需使用render_template函数(需先创建templates文件夹存放HTML文件):

from flask import render_template

@app.route('/page')
def page():
    # 渲染templates文件夹下的index.html
    return render_template('index.html', title="首页")

示例templates/index.html

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>这是一个HTML页面</h1>
</body>
</html>

3. 返回JSON数据

如果需要返回JSON格式的数据(如API接口),使用jsonify函数(自动设置Content-Type: application/json):

from flask import jsonify

@app.route('/api/user')
def get_user():
    user = {
        "name": "小红",
        "age": 20,
        "hobby": "编程"
    }
    return jsonify(user)  # 返回JSON数据,状态码200

4. 重定向

如果需要跳转到其他页面(如登录后跳转首页),使用redirect函数:

from flask import redirect, url_for

@app.route('/login')
def login():
    # 重定向到首页(url_for自动解析路由函数对应的URL)
    return redirect(url_for('index'))

5. 自定义状态码

通过在返回值中添加状态码,可以明确告诉客户端请求结果(如404、500等):

@app.route('/not_found')
def not_found():
    return "页面不存在", 404  # 状态码404:资源不存在

三、综合示例:一个简单的表单交互

下面通过一个完整示例,展示请求和响应的结合使用:

from flask import Flask, request, render_template, redirect, url_for, jsonify

app = Flask(__name__)

# 首页:显示表单(GET请求)
@app.route('/')
def index():
    return render_template('form.html')  # 渲染templates/form.html

# 处理表单提交(POST请求)
@app.route('/submit', methods=['POST'])
def submit():
    # 获取表单数据
    username = request.form.get('username')
    email = request.form.get('email')

    # 简单验证
    if not username or not email:
        return "用户名和邮箱不能为空!", 400  # 返回错误信息和400状态码

    # 模拟处理数据(如存入数据库)
    print(f"收到用户数据:{username}, {email}")

    # 返回JSON响应(也可重定向到成功页)
    return jsonify({
        "status": "success",
        "message": f"欢迎 {username}!数据已接收"
    })

if __name__ == '__main__':
    app.run(debug=True)

templates/form.html(需在项目根目录创建templates文件夹):

<!DOCTYPE html>
<html>
<head>
    <title>用户表单</title>
</head>
<body>
    <h1>请填写信息</h1>
    <form method="POST" action="/submit">
        <input type="text" name="username" placeholder="用户名" required><br><br>
        <input type="email" name="email" placeholder="邮箱" required><br><br>
        <button type="submit">提交</button>
    </form>
</body>
</html>

四、总结

  • 请求对象(request):用于获取客户端发送的数据,核心关注method(请求方法)、args(GET参数)、form(POST表单)。
  • 响应对象(response):用于返回结果给客户端,常见方式有字符串、HTML(render_template)、JSON(jsonify)、重定向(redirect)。
  • 关键原则:GET请求用于获取数据(参数放在URL中),POST请求用于提交数据(参数放在请求体中);返回JSON用jsonify,返回页面用render_template

通过本文,你应该对Flask的请求和响应对象有了基本了解。接下来可以尝试自己编写简单的Web页面或API接口,加深理解~

小夜