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(视图函数)的。

阅读剩余
THE END