路由参数
默认string,可以指定参数的类型限定,限定参数为int
@app.route('/user/')
def user_info(user_id):
return 'hello{}'.format(user_id)
指定请求方式
@app.route('/demo2',methods=['GET','POST'])
def demo2():
return request.method
Json数据格式
主要分为两种
Json对象:大括号所包括的
Json数据:中括号所包括的
Json字符串和字典间的转换
Json字符串转换成字典
tvs = """
{
"subjects": [
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
},
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
},
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
}
]
}
"""
# tvs 是一个json字符串
import json
# json.loads()将Json字符串转化成字典
print(type(tvs))
test_dict = json.loads(tvs)
print(type(test_dict))
print([x for x in test_dict["subjects"][:2]])
主要为
import json
# json.loads()将Json字符串转化成字典
test_dict = json.loads(tvs)
字典转换成Json字符串
# 将字典类型转换成json
json_dict = {
"name":"zhangsan",
"age":18
}
# json.dumps将python字典转化成json字符串
res = json.dumps(json_dict)
print(type(res))
主要为
import json
# json.dumps将python字典转化成json字符串
res = json.dumps(json_dict)
返回Json格式
使用jsonify
from flask import jsonify
@app.route('/demo3')
def demo3():
json_dict = {
"name":"xiaoming",
"age":18,
}
return jsonify(json_dict)
使用json.dumps()
import json
@app.route('/demo4')
def demo4():
json_dict = {
"name":"xiaoming",
"age":18,
}
res = json.dumps(json_dict)
return res
注:不推荐使用 json.dumps() 转换成Json字符串返回,因为返回的数据要符合HTTP协议规范,如果是json需要指定 Content-Type: application/json
重定向
重定向
# 重定向
from flask import redirect
@app.route('/demo5')
def demo5():
return redirect("https://www.bilibili.com/")
重定向到自己的视图函数
# 重定向到自己的视图函数
from flask import url_for
@app.route('/demo6')
def demo6():
return redirect(url_for('demo3'))
重定向到带有参数的视图函数视图函数
# 重定向到带有参数的视图函数视图函数
@app.route('/demo7')
def demo7():
# {% url '' 参数 %}Django
return redirect(url_for('user_info',user_id=123))
自定义状态码
# 自定义状态码
@app.route('/demo8')
def demo8():
# python 中的return可以一次返回多个对象
return '自定义状态码', 666
使用正则表达式匹配路由
1、 导入转换器基类,在flask中,所有的路由匹配规则都是使用转换器对象进行记录
2、 自定义转换器继承BaseConverter
3、 添加转换器到默认的字典中
4、 使用自定义转换器实现自定义规则匹配
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1、 导入转换器基类,在flask中,所有的路由匹配规则都是使用转换器对象进行记录
# 2、 自定义转换器继承BaseConverter
# 3、 添加转换器到默认的字典中
# 4、 使用自定义转换器实现自定义规则匹配
class RegexConverter(BaseConverter):
def __init__(self,url_map,*args):
super(RegexConverter, self).__init__(url_map)
# 将第一个参数当做匹配规则进行保存
print(args[0])
self.regex = args[0]
app.url_map.converters['re'] = RegexConverter
@app.route('/user/')
def user_info(user_id):
# return 'user_id %d'% user_id
return 'user_id %{}'.format(user_id)
if __name__ == '__main__':
app.run(debug=True)
补获错误异常
1.主动抛出 http异常状态码(只能抛出http协议错误的状态码)
from flask import Flask,abort
app = Flask(__name__)
@app.route('/')
def index():
# 主动抛出 http异常状态码
# 只能抛出http协议错误的状态码
abort(500)
return 'haha'
if __name__ == '__main__':
app.run(debug=True)
2.捕获错误
errorhandler装饰器
from flask import Flask,abort
app = Flask(__name__)
@app.route('/')
def index():
abort(500)
a = 0
b = 10/a
return 'haha'
# 捕获错误
# errorhandler装饰器
@app.errorhandler(500)
def errorhandler_server(e):
return '服务器坏了'
if __name__ == '__main__':
app.run(debug=True)
3.捕获指定的错误
from flask import Flask,abort
app = Flask(__name__)
@app.route('/')
def insex():
a = 0
b = 10/a
return 'haha'
# 捕获指定的错误
@app.errorhandler(ZeroDivisionError)
def ZeroDivisionError(e):
return '除数不能为0'
if __name__ == '__main__':
app.run(debug=True)