本节内容
- 路由参数限定
- 指定请求方式
- 返回Json数据
- 重定向
- 自定义状态码
- 自定义转换器
- 异常捕获
路由的参数限定
flask路由传递参数默认为str类型,我们可以进行限定类型:
在参数的前边加上 ---- 类型名:
#指定参数类型为int类型,也可以指定为其他。
@app.route('/user/<int:user_id>')
def user_info2(user_id):
return f'hello2{user_id}'
访问:
127.0.0.1:5001/user/123
使用的是:
from werkzeug.routing import IntegerConverter
IntegerConverter类进行处理
指定请求方式
from flask import request
#请求方式的限定,默认为GET,
@app.route('/demo1',methods=['GET','POST'])
def demo1():
return request.method
使用postman进行测试:
使用get方式:
使用post方式:
返回JSON格式
一种通用数据格式
JSON与字典的互相转换
tvs = ''' #json字符串
{
"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)) #str
test_dict = json.loads(tvs)
print(type(test_dict)) #dict
print(test_dict["subjects"]) #取出键位subjects的值
print([x for x in test_dict["subjects"][:2]]) # 遍历该值,取出前两个
#将字典转化为json
json_dict = { #dict
'name':"zhangsan",
"age":"18"
}
# json.dumps() 是将字典转化为json字符串
res = json.dumps(json_dict)
print(type(res)) #str
返回json格式的数据
app.py:
from flask import jsonify
#返回json对象{},json数组[]
@app.route('/demo2',methods=['GET','POST'])
def demo2():
json_dict = { # dict
'name': "zhangsan",
"age": "18"
}
return jsonify(json_dict)
运行:
127.0.0.1:5001/demo2
返回json格式:
如果使用json.dumps()进行转换成json格式,那么不符合http协议的规范
import json
@app.route('/demo3',methods=['GET','POST'])
def demo3():
json_dict = { # dict
'name': "zhangsan",
"age": "18"
}
res = json.dumps(json_dict)
return res
运行:
重定向
重定向的使用要用到两个flask下的方法
- redirect()
- url_for()
1.重定向到外部网址
#重定向到百度
from flask import redirect
@app.route('/demo4')
def demo4():
return redirect('https://baidu.com')
2.重定向到自己编写的视图函数/路由
重定向到自己的视图函数
import json
@app.route('/demo3',methods=['GET','POST'])
def demo3():
json_dict = { # dict
'name': "zhangsan",
"age": "18"
}
res = json.dumps(json_dict)
return res
1.根据路由地址进行匹配
@app.route('/demo6')
def demo6():
return redirect('/demo3')
3.使用url_for(视图函数名)进行匹配
@app.route('/demo6')
def demo6():
return redirect(url_for('demo3'))
3.携带参数的重定向
@app.route('/user/<user_id>')
def user_info1(user_id):
return f'hello1{user_id}'
#重定向到自己的视图函数,并添加参数
from flask import url_for
@app.route('/demo5')
def demo5():
#url_for --- 相当于django中{% url '' 参数 %}
return redirect(url_for('user_info1',user_id=333)) #重定向到demo3视图函数
自定义状态码
#自定义状态码
@app.route('/demo7')
def demo7():
#python中的return可以返回多个对象
return '自定义状态码',666
运行:
自定义转换器
自定义转换器的步骤:
- 导入转换器基类,在flask中所有的路由匹配规则都是使用转换器对象进行记录的。
from werkzeug.routing import BaseConverter #转换器基类
BaseConverter类:
- 自定义的转换器都要继承BaseConverter。
RegexConverter类:
#自定义转换器
class RegexConverter(BaseConverter):
def __init__(self,url_map,*args):
super(RegexConverter, self).__init__(url_map) #调用父类的构造器
#将第一的参数当作匹配规则进行保存
self.regex = args[0] #自定义的正则匹配规则赋给父类的regex
- 添加转换器到默认的字典中。
app.url_map.converters['re'] = RegexConverter #添加到默认字典中
已有的转换器:
4.使用自定义的转换器实现自定义规则匹配
@app.route('/user/<re("[0-9]{3}"):user_id>')
def index(user_id):
return 'hello%{}'.format(user_id)
分析图解:
异常捕获
@app.route('/')
def index1():
#主动抛出http异常状态码,只能抛出http协议错误的状态码404,500等
abort(500)
return 'hello'
#捕获错误
# errorhandler装饰器:
@app.errorhandler(500) #捕获500错误,执行对应函数
def errorhandler_server(val):
return '服务器坏了'
访问:127.0.0.1:5000:
除0错误:
@app.route('/index2')
def index2():
#主动抛出http异常状态码,只能抛出http协议错误的状态码404,500等
a = 0
b=1/a
return 'hello'
#捕获除0错误
@app.errorhandler(ZeroDivisionError) #捕获500错误,执行对应函数
def zeroDivisionError(val):
return f'除数不能为0:{val}'
访问:127.0.0.1:5000/index2:
网友评论