Flask响应对象:返回JSON与重定向

当我们使用Flask开发Web应用时,经常需要根据不同场景返回不同类型的响应。比如,给前端API返回JSON数据,或者在用户访问旧页面时自动跳转到新页面。这时候就需要用到Flask的响应对象相关功能:jsonifyredirect

一、返回JSON数据

在Web开发中,API接口通常需要返回JSON格式的数据。如果直接返回Python字典,Flask会将其当作普通字符串处理,导致前端无法正确解析。这时需要使用jsonify函数。

为什么用jsonify

  • 自动设置响应头jsonify会自动设置Content-Type: application/json,告诉前端这是JSON格式数据。
  • 处理复杂数据:支持Python字典、列表等数据结构,自动转换为标准JSON格式。

示例代码

from flask import Flask, jsonify

app = Flask(__name__)

# 返回JSON数据的接口
@app.route('/api/info')
def get_info():
    # 定义Python字典(或列表)
    data = {
        "name": "Flask",
        "version": "2.3.3",
        "features": ["轻量", "灵活", "易扩展"]
    }
    # 使用jsonify返回JSON响应
    return jsonify(data)

错误示例

如果直接返回字典,Flask会返回错误的格式:

@app.route('/api/info')
def get_info():
    data = {"name": "Flask"}
    return data  # 错误!返回的是字符串格式,前端无法解析JSON

二、重定向(Redirect)

当需要让用户访问一个新的URL(比如旧页面迁移、表单提交后跳转)时,需要使用redirect函数生成重定向响应。

为什么用redirect

  • 告诉浏览器跳转:通过HTTP状态码(默认302)告诉浏览器“该URL已移动,需访问新地址”。
  • 避免重复提交:比如用户提交表单后,防止重复提交,重定向到结果页。

示例代码

from flask import Flask, redirect, url_for

app = Flask(__name__)

# 旧页面,重定向到新页面
@app.route('/old-page')
def old_page():
    # 使用url_for根据视图函数名获取新页面的URL(更灵活,避免硬编码)
    return redirect(url_for('new_page'), code=302)  # code=302为临时重定向

# 新页面
@app.route('/new-page')
def new_page():
    return "欢迎来到新页面!"

状态码说明

  • 302(临时重定向):搜索引擎可能不认为原URL永久失效,常用于临时跳转(如活动页跳转)。
  • 301(永久重定向):搜索引擎会记住URL变更,常用于域名迁移等永久场景。
    示例:return redirect(url_for('new_page'), code=301)

三、综合示例:表单提交后跳转并返回JSON

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

app = Flask(__name__)

# 1. 模拟用户登录表单
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        # 简单验证(实际需结合数据库)
        if username == "admin" and password == "123456":
            # 登录成功,重定向到首页并返回用户信息
            return redirect(url_for('home'))
        else:
            return "用户名或密码错误!"
    # GET请求:渲染登录表单
    return '''
    <form method="post">
        <input type="text" name="username" placeholder="用户名"><br>
        <input type="password" name="password" placeholder="密码"><br>
        <button type="submit">登录</button>
    </form>
    '''

# 2. 登录成功后返回JSON数据
@app.route('/home')
def home():
    user_info = {
        "username": "admin",
        "role": "管理员",
        "status": "已登录"
    }
    return jsonify(user_info)  # 返回用户信息JSON

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

总结

  • 返回JSON:用jsonify,自动处理格式和响应头,避免前端解析错误。
  • 重定向:用redirect,结合url_for避免硬编码URL,根据场景选择301/302状态码。
  • 核心区别jsonify是“返回数据”,redirect是“跳转地址”,分别对应不同业务场景。

通过这两个工具,Flask能灵活处理API数据返回和页面跳转,满足大部分Web开发需求。

小夜