Flask服务端响应机制与重定向处理详解
本文详解Flask框架中的服务端响应与重定向处理。内容涵盖HTML、JSON及媒体文件的返回方式,重点解析jsonify的使用及中文编码、pretty print等常见报错的解决方案。同时深入讲解redirect与url_for在站内及站外重定向中的应用,包括路径参数传递与权限校验逻辑,帮助开发者掌握Flask请求响应的核心机制。
Flask响应
Flask默认支持两种主要的响应方式:
数据响应:默认返回HTML文本,同时也支持返回JSON格式数据或其他媒体类型文件。
页面响应:通过重定向实现。
利用url_for函数进行视图之间的跳转。
在构建响应时,Flask允许自定义HTTP响应状态码。
响应HTML文本
视图函数的返回值即为响应结果。
1. 返回字符串
return "123"

使用Postman请求,查看响应结果。

默认情况下,响应结果被视为HTML页面。

如果返回值类型不是Response对象,Flask会将视图的返回值作为Response对象的实例参数返回给客户端。可以通过元组方式返回,其中第一个参数为HTML文本,第二个参数为响应状态码,第三个参数为响应头信息(以字典形式传递)。
return "<h1>hello</h1>", 400, {"company": "python"}
在浏览器中访问,查看响应内容、状态码及响应头字段。

2. 借助make_response()函数返回Response对象
需要导入make_response模块。
from flask import Flask,make_response
return make_response("<h1>hello</h1>", 400, {"study": "flask"})

在浏览器中访问测试。

3. 通过Response类直接返回Response对象
需要导入Response模块。
from flask import Flask,Response
查看Response类的源码参数定义。


在浏览器中访问,查看响应结果,此时状态码已被修改,并包含了自定义的响应头。

完整代码示例如下:
from flask import Flask,make_response, Response
app = Flask(__name__)
app.config.update({
"DEBUG": True
})
@app.route("/")
def index():
# 默认返回的就是HTML代码,在flask内部调用视图时,得到的返回值会被flask判断类型,
#随意返回个字符串,默认响应结果是html页面
# return "123"
# 如果类型不是response对象,则视图的返回值会被作为response对象的实例参数返回客户端
#以元祖方式返回,第一个参数是html文本,第二个参数是响应状态码,第三个参数是响应头信息,字典方式传参
# return "<h1>hello</h1>", 400, {"company": "python"}
#可以借助make_response()函数来返回Response对象
# return make_response("<h1>hello</h1>", 400, {"study": "flask"})
# 通过Response返回Response对象
return Response(f"默认首页", 201, {"company": "python"})
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
返回JSON数据
1. 响应JSON数据(原生写法)
data = {"name": "小明", "age": 16}
#一定要加上content-type响应头,否则响应的为html页面
return json.dumps(data,ensure_ascii=False), 200, {"Content-Type": "application/json"}

在浏览器中访问测试。

#也可以用Response返回json
return Response(json.dumps(data), 200, {"Content-Type": "application/json"})


2. 返回JSON格式数据,包括列表等多种JSON数据结构,使用jsonify方法。
jsonify返回的是一个Response对象。在Flask中,可以直接使用jsonify生成JSON响应,需导入该模块。
from flask import Flask, jsonify
data = [
{"id": 1, "username": "liulaoshi", "age": 18},
{"id": 2, "username": "liulaoshi", "age": 17},
{"id": 3, "username": "liulaoshi", "age": 16},
{"id": 4, "username": "小明", "age": Decimal(15)},
]
return jsonify(data)

在浏览器中访问,jsonify会自动将响应头Content-Type设置为application/json。

返回JSON的完整代码示例:
from flask import Flask, jsonify, Response
from decimal import Decimal
import json
app = Flask(__name__)
# app.config.update({
# "JSONIFY_PRETTYPRINT_REGULAR": False,
# "SON_AS_ASCII":False
# })
@app.route("/")
def index():
# """返回json格式数据,返回json字典"""
# data = {"name":"xiaoming","age":16}
# return data
"""响应json数据[原生写法]"""
# data = {"name": "小明", "age": 16}
#一定要加上content-type响应头,否则响应的为html页面
# return json.dumps(data,ensure_ascii=False), 200, {"Content-Type": "application/json"}
#也可以用Response返回json
# return Response(json.dumps(data), 200, {"Content-Type": "application/json"})
"""返回json格式数据,返回各种json数据,包括列表,jsonify写法"""
data = [
{"id": 1, "username": "liulaoshi", "age": 18},
{"id": 2, "username": "liulaoshi", "age": 17},
{"id": 3, "username": "liulaoshi", "age": 16},
{"id": 4, "username": "小明", "age": Decimal(15)},
]
return jsonify(data)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
3. 常见报错处理
如果遇到报错AttributeError: ‘Request’ object has no attribute ‘is_xhr’。
解决方法:将JSONIFY_PRETTYPRINT_REGULAR配置项设置为False即可解决。
app = Flask(__name__)
app.config.update({
"JSONIFY_PRETTYPRINT_REGULAR": False,
})
如果遇到返回的中文编码不正确的问题,解决方法是在Flask配置文件中设置JSON_AS_ASCII = False以支持中文显示。
app.config.update({
"SON_AS_ASCII":False
})
综合对比,在Flask中返回JSON数据,使用jsonify方法即可。直接return仅能返回字典格式的JSON数据。
响应指定媒体类型文件
向客户端响应图片,首先查看原图片。

视图函数实现如下:
@app.route("/img")
def img():
"""响应图片格式给客户端"""
with open("对称加密.png", "rb") as f:
data = f.read()
return data, 200, {"Content-Type": "image/png"} # MIME类型
在浏览器中访问,可以成功获取图片数据。

不仅限于图片类型,视频、音频、压缩包等均可响应,只要明确文件的MIME类型即可。常见的MIME类型可在线查询。

重定向
1. 重定向到站外地址
需要导入redirect模块。
from flask import Flask, redirect
redirect函数的参数说明。

视图函数实现:
@app.route("/")
def index():
"""页面跳转"""
"""
301: 永久重定向,页面已经没有了,站点没有了,永久转移了。
302:临时重定向,一般验证失败、访问需要权限的页面进行登录跳转时,都是属于临时跳转。
"""
# redirect函数就是response对象的页面跳转的封装
response = redirect("https://www.baidu.com", 302)
return response
redirect的原理,最终仍是借助Response对象来实现。
# redirect的原理,最终还是借助Resonse对象来实现:
response = "", 302, {"Location": "https://www.baidu.com"}
return response

完整代码示例:
from flask import Flask, redirect
# 应用实例对象
app = Flask(__name__)
@app.route("/")
def index():
"""页面跳转"""
"""
301: 永久重定向,页面已经没有了,站点没有了,永久转移了。
302:临时重定向,一般验证失败、访问需要权限的页面进行登录跳转时,都是属于临时跳转。
"""
# redirect函数就是response对象的页面跳转的封装
# response = redirect("https://www.baidu.com", 302)
# redirect的原理,最终还是借助Resonse对象来实现:
response = "", 302, {"Location": "https://www.baidu.com"}
return response
if __name__ == '__main__':
# 启动项目的web应用程序
app.run(host="0.0.0.0", port=5000, debug=True)
2. 重定向到站内自定义视图函数
可以直接填写目标URL路径。
也可以使用url_for生成指定视图函数对应的URL。
from flask import url_for
通过判断查询参数中是否存在token,来决定是否需要跳转到登录页面。
from flask import Flask, redirect, Response,request
from flask import url_for
# 应用实例对象
app = Flask(__name__)
@app.route("/user")
def index():
if request.args.get("token"):
print('token',request.args.get("token"))
return "个人中心"
# 跳转页面到登录视图中
# redirect("url地址") # 控制页面跳转到任意路径下
# return redirect("/login")
# 跳转页面到其他视图中
url = url_for("login") # url_for("视图名称")
print(app.url_map) # 路由列表,整个flask站点中所有的url地址和视图的映射关系都在这个属性里面
print(url)
return redirect(url)
@app.route("/login")
def login():
return "登录视图"
if __name__ == '__main__':
# 启动项目的web应用程序
app.run(host="0.0.0.0", port=5000, debug=True)
在浏览器中访问,首次查询参数不带token,页面跳转至登录视图:http://127.0.0.1:5000/user。

app.url_map属性返回整个站点所有URL地址与视图的映射关系。

当查询参数带上token时,直接进入个人中心:http://127.0.0.1:5000/user?token=www。

3. 重定向到带有路径参数的视图函数
在url_for函数中传入相应参数。
from flask import Flask, redirect, url_for
# 应用实例对象
app = Flask(__name__)
@app.route("/demo/<int:mob>")
def mobile(mob):
print(mob)
return f"mobile={mob}"
@app.route("/sms")
def sms():
"""携带路径参数进行站内跳转"""
# url_for("视图方法名", 路由路径参数名=路由参数值)
url = url_for("mobile", mob=13312345678)
print(url)
return redirect(url)
if __name__ == '__main__':
# 启动项目的web应用程序
app.run(host="0.0.0.0", port=5000, debug=True)
在浏览器中访问http://127.0.0.1:5000/sms,将会跳转到http://127.0.0.1:5000/demo/13312345678。

总结:
到此关于Flask服务端响应与重定向处理的介绍结束,更多相关Flask服务端响应与重定向内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









