Flask开发(十一)Flask视图高级技术 app.route与add_url_rule
本篇导读:
- app.route的使用
- add_url_rule的使用
如何自己定义视图函数?如何定义和使用装饰器?如果功能代码过多,如何实现程序的模块化编程?本阶段将围绕这些问题,主要介绍路由函数、Flask类视图、基于方法的类视图、装饰器、蓝图的概念和基本使用,并且会详细介绍如何是同装饰器。
在Flask应用中,路由是指用户的请求的url与视图之间的映射,处理url和函数之间的关系的程序成为路由。Flask框架根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数,并将视图函数执行的结果返回给服务器。
app.route的使用
在Flask框架中,默认是使用@app.route装饰器将视图函数和URL绑定,例如:
@app.route('/') def hello_world(): return render_template("index.html")
上述函数中,视图函数是hello_world(),使用app.route装饰器会将URL和执行的视图函数的关系保存到app.url_map属性上。
上述代码实现了将url‘/’与视图函数hello_world()的绑定,我们可以通过url_for('hello_world')反转得到‘/’,实际上我们可以给这个装饰器再加上endpoint参数(给这个url命名):
@app.route('/',endpoint='index') def hello_world(): return 'Hello_World'
一旦我们使用了endpoint参数,在使用url_for()反转时就不能使用函数名了,而是要使用我们自定义的URL名。
url_for('index')
add_url_rule的使用
除了使用@app.route装饰器,我们还可以使用add_url_rule来绑定视图函数和URL,请看以下代码:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' def my_test(): return '这是测试页' app.add_url_rule('/test/',endpoint='my_test',view_func=my_test) if __name__ == '__main__': app.run()
add_url_rule函数的参数如下:
- rule:设置的url
- endpoint:给url设置的名称
- view_func:指定视图函数的名称
实际上,app.route装饰器的内部,使用的也是add_url_rule:
[infobox title="app.route装饰器源码"]
def route(self, rule: str, **options: t.Any) -> t.Callable: def decorator(f: t.Callable) -> t.Callable: endpoint = options.pop("endpoint", None) self.add_url_rule(rule, endpoint, f, **options) return f return decorator
[/infobox]
下面在app.py中写下如下代码:
from flask import Flask,url_for app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' def my_test(): return '这是测试页' app.add_url_rule('/test/',endpoint='my_test',view_func=my_test) with app.test_request_context(): print(url_for('my_test')) if __name__ == '__main__': app.run()
运行程序,结果如下:
Flask是通过endpoint找到viewfunction(视图函数)的。