signed

QiShunwang

“诚信为本、客户至上”

1-2 flask 注册路由 route()装饰器

2020/8/20 15:40:52   来源:

在一个Web应用里,客户端和服务器上的Flask程序互交。可以简单的概括为以下几步:

 

1,用户在浏览器输入URL访问某个资源。

2,Flask接收用户请求并分析请求的URL。

3,为这个URL找到对应的处理函数。

4,执行函数并生成响应,返回给浏览器。

5,浏览器接收并解析响应,将信息显示在页面中。

 

在上面这些步骤中,大部分都由Flask完成,我们要做的只是建立处理请求的函数,并为其定义对应的URL规则。只需为函数附加app.route()装饰器,并传入RUL规则作为参数,我们就可以让URL与函数建立关联。这个过程我们称为注册路由(route),路由负责管理URL和函数之间的映射,而这个函数则被称为视图函数(view function)

附注:路由的含义可以从字面意义理解,作为动词时,它的含义是“ 按某路线发送",即调用与请求URL对应的视图函数。

@app.route('/')

defindex():

    return'<h1>HelloFlask</h1>'

在这个程序里,app.route()装饰器把跟地址/和index()函数绑定起来,当用户访问这个URL时就会触发index(),这个视图函数和其他函数一样可以进行任意的操作,比如从数据库中获取数据,获取请求信息,对用户输入的数据进行计算和处理。最后,视图函数返回的值将作为响应的主体,一般来说,响应的主体就是呈现在浏览器窗口的HTML页面。在最小的程序中,视图函数index()返回一行问候。

 

虽然这个程序相当的简单,但它却是大部分flask程序的基本模式。在复杂的程序中,我们会有许多个视图函数分别处理不同的URL请求,在视图函数中会完成更多的工作,并且返回包含各种链接,表单,图片的HTML文件,而不仅仅是一行字符串。返回的页面中链接又会指向其他UTL,被单击后触发对应的视图函数,获得不同的返回值,从而显示不同的页面,这就是我们浏览网页时的体验。

 

route()装饰器

route()装饰器的第一个参数是URL规则,用字符串表示,必须以斜杠(/)开始。这里的URL是相对URL(又称为内部URL),即不包含域名的URL。以域名www.helloflask.com为例,“ / ”对应对根地址(即www.helloflask.com),如果把URL规则改为“ /hello ”,则实际的绝对地址是www.helloflask.com/hello。

@app.route('/')

defindex():

    return"<h1>helloflask</h1>"

假如这个程序部署在www.helloflask.com的服务器上,当启动服务器后,只要你在浏览器上访问www.helloflask.com,就会看到浏览器上显示一行" hello flask "的问候。

 

1,为视图函数绑定多个URL

一个视图函数可以绑定多个URL,比如下面的代码吧/hi和/hello都绑定到say_hello()函数上,这就会为say_hello视图注册两个路由,用户访问这个两个URL均会触发say_hello()函数,获得相同的响应,

@app.route("/hi")

@app.route("hello")

defsay_hello():

    return"<h1>helloflask</h1>"

 

2,动态URL

我们不仅可以为视图函数绑定多个URL,还可以在URL规则中添加变量部分,使用" <变量名> " 的形式。Flask处理请求时会把变量传入视图函数中,所以我们可以添加参数获取这个变量值。

@app.route("/greet/<name>")

defgreet(name):

    return"<h1>hello,%s!</h1>"%name

因为URL中可以包含变量,所以我们将传入app.route()的字符串称为URL规则,而不是URL。FLask会解析请求并把请求的URL与视图函数的URL规则进行匹配。比如这个greet视图的URL规则为greet/<name>,那么类似于/greet/foo,/greet/bar的请求都会触发这个视图函数。

 

当URL规则中包含变量时,如果用户访问的URL中没有添加变量,比如/greet,那么flask在匹配失败后会返回一个404错误的响应。

一个很常见的解决办法是在app.route()装饰器里使用defaults参数设置URL变量的默认值,这个参数接收字典作为参数输入,储存URL变量和默认参数的映射。例如:

@app.route(“/greet”,defaults={'name':'Programmer'})

@app.route("/greet/<name>")

defgreet():

    return'<h1>hello%s</h1>'%name

这是如果用户访问/greet,那么变量name会使用默认值Programmer,视图函数返回<h1>hello, Programmer</h1>。上面的用法实际上效果等同于。

@app.route(“/greet”)

@app.route("/greet/<name>")

defgreet(name='Programmer'):

    return'<h1>hello%s</h1>'%name