3.路由
3.1 配置路由两种方式
# 配置路由两种方式
from flask import Flask
app = Flask(__name__)
"""
@app.route的流程
1.执行 decorator = app.route('/index', methods=['POST','GET'])
3.@decorator,相当于执行 decorator(index)
执行代码add_url_rule(rule, endpoint, f, **options)
"""
# 方式一
@app.route('/index', methods=['POST','GET'])
def index():
return 'Hello World!'
# 方式二
def order():
return 'order'
app.add_url_rule('/order', view_func=order)
if __name__ == '__main__':
app.run()
3.2 url_for
给指定的函数构造 URL, 它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数 。一般与重定向一起使用。
# url_for反向生成url
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
print(url_for('n1'))
print(url_for('n2'))
print(url_for('user', username='cys'))
return "index"
@app.route('/login', methods=['POST', 'GET'],endpoint='n1')
def login():
pass
@app.route('/logout', methods=['POST', 'GET'],endpoint='n2')
def logout():
pass
@app.route('/user/<username>')
def user(username):
pass
if __name__ == '__main__':
app.run()
# 结果如下
# /login
# /logout
# /user/cys
3.3 路由转换器
参考:https://cloud.tencent.com/developer/article/1538653
3.3.1 自带转换器
- int转换器
<int:param>
:接收整数 - float转换器
<float:param>
: 接收浮点数 - string转换器
<string:param>
: 接收string类型(默认则是string转换器) - path转换器
<path:param>
: 和默认的相似,但也接收斜线
# 转换器
from flask import Flask
app = Flask(__name__)
# 转换器 <int:goods_id>
@app.route('/intconverter/<int:params>')
def int_param(params):
return "-->> %s" % params
# 设置float转换器
@app.route('/floatconverter/<float:params>')
def float_param(params):
return "-->> %s" % params
# 设置转换器 <string:goods_id>
@app.route('/strconverter/<string:params>')
def str_param(params):
return "-->> %s" % params
# 设置path转换器
@app.route('/pathconverter/<path:params>')
def path_param(params):
return "-->> %s" % params
if __name__ == '__main__':
app.run()
3.3.2 自定义万能转换器
需要继承BaseConverter。
使用正则表达式:
# 自定义转换器
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1.定义自己的转换器
class RegexConverter(BaseConverter):
"""
自定义转换器
"""
def __init__(self, url_map, regex):
# 调用父类的初始化方法
super(RegexConverter, self).__init__(url_map)
# 将正则表达式的参数保存到对象属性中,flask会使用这个属性来进行路由的正则匹配
self.regex = regex
def to_python(self, value):
# value是从路径里拿到的字符串
# return出去的是视图函数接受到的值,可以进行转换,例如转成int:return int(value)
return value
# 2.将自定义的转换器添加到flask应用中
app.url_map.converters['re'] = RegexConverter
# 转换器
@app.route("/tel/<re(r'1[34578]\d{9}'):tel>")
def goods_detail(tel):
return "tel is {}".format(tel)
if __name__ == '__main__':
app.run()
手机号码转换器
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
def __init__(self,url_map,mobile):
super(MobileConverter, self).__init__(url_map)
self.regex = r'1[34578]\d{9}'
app.url_map.converters['mobile'] = MobileConverter # 注册
@app.route("/goods/<mobile:goods>")
def goods_detail(goods):
return "goods id is {}".format(goods)
3.4 视图函数添加装饰器
黑视图添加装饰器一般可用来做一些登录验证、日志记录、全局返回等。
注意点:
1.被同一个装饰器装饰的视图函数,他们的endpoint一样,会报错,所以使用@functools.wraps(func)修饰,使他们为原来自己的函数名
- 装饰器一定要写到@app.route下面,不然每次不生效
# 给视图添加装饰器
from flask import Flask
import functools
app = Flask(__name__)
def wapper(func):
# 被同一个装饰器装饰的视图函数,他们的endpoint一样,会报错,所以使用@functools.wraps(func)修饰,使他们为原来自己的函数名
@functools.wraps(func)
def inner(*args, **kwargs):
print("inner")
return func(*args, **kwargs)
return inner
@app.route('/')
@wapper # 装饰器一定要写到@app.route下面,不然每次不生效
def index():
return 'index'
@app.route('/order', methods=['GET', 'POST'])
@wapper
def order():
return 'order'
if __name__ == '__main__':
app.run()