路由就是一种映射关系。是绑定应用程序和url地址的一种一对一的映射关系!我们在开发过程中,编写项目时所使用的路由往往是指代了框架/项目中用于完成路由功能的类,这个类一般就是路由类,简称路由。
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World' # 指定访问路径为 demo @app.route('/demo') def demo1(): return 'demo' if __name__ == '__main__': app.run()
注意:路由和视图的名称必须全局唯一,不能出现重复,否则报错。
<参数类型:username>
# 设置username为int类型 <int:username>
注意:路由参数就是url路径的一部分
@app.route('/user/<uid>') def user(uid): return f'uid={uid}'
运行结果:
flask系统自带转换器编写在werkzeug.routing.py文件中的DEFAULT_CONVERTERS字典中。系统自带的转换器具体使用方式在每种转换器的注释代码中有写。
DEFAULT_CONVERTERS = { "default": UnicodeConverter, "string": UnicodeConverter, # 默认类型,接受不带斜杠的任何文本 default、string是一样的 "any": AnyConverter, # 可以指定多种路径 "path": PathConverter, # 接收string但也接受斜线 "int": IntegerConverter, # 接受正整数 "float": FloatConverter, # 接受正浮点值 "uuid": UUIDConverter, # 接受UUID(通用唯一识别码)字符串 xxxx-xxxx-xxxxx-xxxxx }
给参数指定类型,就在参数前加上参数类型和冒号即可。如下,指定id是int类型,可以直接进行运算。
@app.route('/user1/<int:id>') def user1(id): id = str(id ** 2) return id
运行结果:
指定path类型,可以获取当前路径,值得注意的是获取的不是完整路径,只是此处传入的路径参数,如下获取的路径是 testpath/test
@app.route('/<path:url_path>/') def user2(url_path): return f'url_path = {url_path}'
运行结果:
@app.route('/user3/<uuid:uu>') def user3(uu): return f'uu = {uu}'
运行结果:
@app.route('/user4/<any(article,blog):url_path>') def user4(url_path): return f'url_path = {url_path}' # 以上例子中,user4这个函数可以接受两个URL,一个是http://127.0.0.1:5000/user4/article/,另一个是http://127.0.0.1:5000/user4//blog/。并且,一定要传url_path参数,当然这个url_path的名称可以随便。
运行结果:
也叫正则匹配路由参数.
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问
具体实现步骤为:
# 导入转换器基类 from werkzeug.routing import BaseConverter # 自定义正则转换器 class RegexConverter(BaseConverter): def __init__(self, map, *args): super().__init__(map) # 正则参数 self.regex = args[0] # 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re app.url_map.converters['re'] = RegexConverter # 正则匹配路由 @app.route("/sms/<re('1[3-9]\d{9}'):mobile>") def sms(mobile): return f"mobile={mobile}"
运行结果:
flask中请求默认是get请求,若想要指定其他请求方式,用参数methods指定。
如用户注册时,需要把用户填写的数据存入数据库,生成一条新用户的记录,此处就需要用到post请求。
@app.route('/register/', methods=['POST']) def register(): register_dict = request.form username = register_dict['usrename'] password = register_dict.get('password') user = User() user.username = username user.password = password db.session.add(user) db.session.commit() return '创建用户成功'