一个很好的博客
flask默认支持两种响应方式
数据响应:默认响应html文本,也可以返回json格式或者其他格式
页面响应:重定向
响应的时候,flask也支持自定义http响应状态码
响应html文本
python
from flask import Flask,make_response, Response
app = Flask(__name__)
app.config.update({
"DEBUG": True
})
@app.route("/")
def index():
# 默认返回的就是HTML代码,在flask内部调用视图时,得到的返回值会被flask判断类型,
# 如果类型不是response对象,则视图的返回值会被作为response对象的实例参数返回客户端
"""响应HTML文本,并设置响应状态码"""
# return "<h1>hello, flask</h1>", 400
"""通过make_response返回Response对象"""
# response = make_response("<h1>hello, flask</h1>", 201)
# print(response)
# return response
"""通过Response返回Response对象"""
response = Response("<h1>hello, flask</h1>", 201)
return response
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
响应json数据
python
from flask import Flask, jsonify
from decimal import Decimal
app = Flask(__name__)
app.config.update({
"DEBUG": True,
"JSONIFY_PRETTYPRINT_REGULAR": False,
})
@app.route("/")
def index():
# """返回json格式数据,返回json字典"""
# data = {"name":"xiaoming","age":16}
# return json.dumps(data), 200, {"Content-Type": "application/json"}
# return Response(json.dumps(data), 200, {"Content-Type": "application/json"})
"""响应json数据[jsonify]"""
data = {"name": "xiaoming", "age": 16}
response = jsonify(data)
print(response)
return response
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
响应图片
python
from flask import Flask, Response
app = Flask(__name__)
app.config.update({
"DEBUG": True,
"JSONIFY_PRETTYPRINT_REGULAR": False,
})
@app.route("/")
def index():
"""响应图片格式给客户端"""
with open("avatar.png", "rb") as f:
data = f.read()
return data, 200, {"Content-Type": "image/png"} # MIME类型
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
flask的url、页面跳转和重定向_flask 转向网址-CSDN博客
一般我们通过一个url就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个url呢?url_for函数就可以实现这个功能。url_for()函数接受两个及以上的参数,它接受函数名作为第一个参数,接受对应的url规则的命名参数。如果还出现其他的参数。则会添加到url的后面作为查询参数。
通过构建url的方式而选择直接在代码中拼url的原因有两点
将来如果修改了url,但没有修改该url对应的函数名,就不用到处去替换url了。
url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动地帮我们搞定。
重定向分为永久性重定向 和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面,比如用户访问需要权限的页面,但是该用户当前并没有登录,因此我们需要给他重定向到登录页面。
永久性重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问。
暂时性重定向:http的状态码是302,表示页面的暂时性跳转,比如访问一个需要权限的网址,如果该用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
在flask中,重定向就是通过flask.redirect(location,code=302)这个函数来实现的,location表示需要重定向到的url,应该配合之前讲的url_for()函数来实现,code表示采用哪个重定向,默认是302也暂时性重定向,可以修改成301来实现永久性重定向。
页面跳转
python
from flask import Flask, request, redirect, url_for, Response
app = Flask(__name__)
@app.route("/user")
def index():
if 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 "登录视图"
@app.route("/jump")
def jump():
"""跳转页面到站外"""
"""
301: 永久重定向,页面已经没有了,站点没有了,永久转移了。[域名映射-->域名解析]
302:临时重定向,一般验证失败、访问需要权限的页面进行登录跳转时,都是属于临时跳转。
"""
# response = redirect("https://www.qq.com", 302)
# 上面会跳转到qq的页面
# print(response)
# return response
# 底层原理
response = Response("", 302, {"Location": "https://www.163.com"})
return response
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
跳转页面到有路由参数的地址
python
from flask import Flask, request, redirect, url_for, Response
app = Flask(__name__)
@app.route("/mobile/<int:mobile>")
def sms(mobile):
"""发送短信"""
return f"发送短信给{mobile}"
@app.route("/info")
def info():
# 跳转页面到一个具有路由参数的视图中
# return redirect("/sms/13012345678")
url = url_for("sms", mobile="13012345677")
print(url) # /sms/13012345677
return redirect(url)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
自定义响应头
python
from flask import Flask, request, redirect, url_for, Response
app = Flask(__name__)
@app.route("/")
def index():
"""自定义响应头"""
return "hello, flask", 201, {"Company": "flask.edu"}
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)