1、需求
如何在不同的场景里返回不同的响应信息?
2、返回模板
使用render_template
方法渲染模板并返回
例如,新建一个模板index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
</body>
</html>
后端视图
from flask import render_template
@app.route('/')
def index():
mstr = 'Hello 黑马程序员'
mint = 10
return render_template('index.html', my_str=mstr, my_int=mint)
示例代码:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
mstr = 'Hello world'
mint = 10
return render_template('index.html', my_str=mstr, my_int=mint)
if __name__ == '__main__':
app.run()
运行效果:
示例代码2:【对上面代码稍做改变】
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
# mstr = 'Hello world'
# mint = 10
data = dict(
my_str='Hello world',
my_int=10
)
# return render_template('index.html', my_str=mstr, my_int=mint)
return render_template('index.html', **data)
if __name__ == '__main__':
app.run()
运行结果:
3、重定向
示例代码:
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/demo2')
def demo2():
return redirect('http://www.baidu.com')
if __name__ == '__main__':
app.run()
运行结果:
详见博文: Flask框架中的页面跳转和重定向(url_for,redirect)_redirect flask_IT之一小佬的博客-CSDN博客
4、返回字符串
示例代码:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/return_str')
def return_str():
return "return_str"
if __name__ == '__main__':
app.run(debug=True)
运行结果:
5、返回JSON
注意:在早期的版本中,flask框架不能直接返回json字典数据,需要引入jsonify方法。在目前的高版本中,flask框架可以直接返回json字典数据,不用再次使用jsonify方法了,用不用jsonify方法返回的效果都是一样的。
示例代码1:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/json_dict')
def json_dict():
json_dict = {
"user_id": 10,
"user_name": "laowang"
}
return json_dict
@app.route('/jsonify_dict')
def jsonify_dict():
json_dict = {
"user_id": 10,
"user_name": "laowang"
}
return jsonify(json_dict)
if __name__ == '__main__':
app.run(debug=True)
运行结果:
示例代码2:
from flask import Flask, jsonify
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
@app.route('/demo4')
def demo3():
json_dict = {
"user_id": 10,
"user_name_cn": "老王",
"user_name_en": "laowang"
}
return jsonify(json_dict)
if __name__ == '__main__':
app.run(debug=True)
运行结果:
注意:
目前有的浏览器配置或插件会直接将ascii编码转为中文!
6、自定义状态码和响应头
6.1 元祖方式
可以返回一个元组,元组中必须至少包含一个项目,且项目应当由(response, status) 、 (response, headers) 或者 (response, status, headers) 组成。
status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
示例代码:
from flask import Flask
app = Flask(__name__)
@app.route('/return_tuple1')
def return_tuple1():
# TypeError: The view function did not return a valid response tuple.
# The tuple must have the form (body, status, headers), (body, status), or (body, headers).
return '状态码为 666',
@app.route('/return_tuple2')
def return_tuple2():
return '状态码为 666', 666
@app.route('/return_tuple3')
def return_tuple3():
return '状态码为 666', 666, {'name': 'dgw'}
@app.route('/return_tuple4')
def return_tuple4():
return '状态码为 666', 666, [('name', 'dgw')]
@app.route('/return_tuple5')
def return_tuple5():
return '状态码为 666', 666, [('name', 'dgw'), ('age', 26)]
@app.route('/return_tuple6')
def return_tuple6():
return '状态码为 666', 666, {'name': 'dgw', 'age': 27}
@app.route('/return_tuple7')
def return_tuple7():
# TypeError: The view function did not return a valid response.
# The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a int.
return 6666, 666
if __name__ == '__main__':
app.run(debug=True)
运行结果:
6.2 Response方式
示例代码:
from flask import Flask, Response
app = Flask(__name__)
@app.route('/return_response')
def return_response():
return Response("return_response")
if __name__ == '__main__':
app.run(debug=True)
运行结果:
6.3 make_response方式
示例代码:
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/demo5')
def demo5():
resp = make_response('make response测试')
resp.headers['Itcast'] = 'Python'
resp.status = '406 not found'
return resp
if __name__ == '__main__':
app.run()
运行结果: