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