Bootstrap

有故事,带项目的flask教程(2)---flask的路由管理

一大早,离公司上班还有两个小时,老项和小王已经在公司了。因为他们昨天就约好了,以后每天都早点到公司,趁还没上班,老项就给小王讲解flask和项目的东西,顺便帮小王看看前一天的任务完成的如何。

“小王啊,我问你,如果要你做一个网站,你能想到需要做哪些工作?”老项首先问道。

小王思考了一下说:“我觉得肯定要先做网站的页面,当然页面上面展示的数据应该是从服务器上数据库查到的,那应该还要做数据库相关的工作。一个网站有很多页面,访问每个页面的地址也不一样,也需要对这些url地址进行管理。”

老项点了点头说:“说的不错,我来帮你总结一下。你说的url地址管理实际就是flask的路由管理;展示页面和相关数据就是flask的模板处理,数据库相关的操作我们可以使用orm的方式来实现,不过就需要用到flask的第三方包了。今天我们就来说一下flask的路由管理。”

说完,老项就开始了他的讲解。

 

在第一个项目中,我们使用装饰器@app.route("/")设置了一个最简单的路由来修饰函数(注意:这个函数也被称为视图函数,主要用来处理前台页面的展示和数据渲染的,因为我们还没学习模板和数据库的处理,为了演示方便,现在的视图就简单的返回一些字符串),不过实际路由的情况是多种多样的,我们分别来说明。

  • 普通路由

普通路由是指没有参数的路由,比如一个网站的首页,我们会用index来指定它的地址。在flask中,我们也可以用route装饰器来表示普通路由,具体的写法见下图。

pythpi 

一个网站不可能只有一个页面,如果有多个页面,我们就用多个路由来绑定多个视图方法。比如在小王的项目中,除了主页外,我们还可以有一个车型列表页,列举出系统所有可以识别的车型。为了模仿整个汽车识别系统的构架,我们把主页路由修饰的方法也做了调整。具体代码见下图。

pythpi  

 

  • 带参数的路由

更多的时候,路由不是固定的,根据显示的不同页面,路由里面某些字段会发生变化。还是拿小王的项目举例,有了车系列表页,是不是还得有个车系详情页。但是不同的车系详情页显示的内容肯定有区别。我们如何可以让路由可以识别不同的车系呢?我们可以用一个参数来保存车系信息,再让路由来处理参数就行了,具体代码见下图。

pythpi

注意在装饰器里面把参数用<>括起来,然后将该参数作为视图方法的参数进行传递,然后再视图方法中就可以使用这个参数了。那如果路由里面有多个可变的参数,比如一个车系里面还有不同的车型,宝马有X1,X5,Q3等等,如果有一个车型详情页,这个页面的路由就有车系和车型两个参数,这个时候该怎么办呢?其实很简单,我们用两个参数就行了,见下图。

pythpi

 

  • URL参数类型过滤和转换器

在同样的车型下面还有不同的车辆版本,比如宝马X1下面还有时尚型,领先型等等,假设我们用一个数字编号来代表版本,然后在路由里面使用编号作为参数来区分不同的版本。那这个时候就要求flask的路由处理可以对参数类型进行过滤和转换,需要过滤掉编号参数为非数字字符的路由,并且可以把字符转换成数字。其实flask很贴心的为我们准备了转换器,我们先用用看,见下图:

pythpi

注意一下图中类型转换的写法,而且要特别注意“:”号前后不要有空格,否则会报错。根据运行的截图,我们也可以看出这个转换器确实起到了过滤和转换的作用。使用转换器,可以让我们的路由处理更加严谨,flask主要提供了以下四种转换器,见下表。

string

默认的字符转换器,匹配不包含/的字符串

int

接受并转换成整数

float

接受并转换成浮点数

path

匹配包含/的字符串

  • 带正则的路由管理

有的时候我们需要对路由里面的某些参数进行正则匹配,如果有一个网页要显示特定年份的车型,对于年份参数就要进行正则匹配,以防有人输入错误格式的年份。前面学习了flask几个现成的转换器,如果要正则匹配就需要自己定义转换器了,请见下图。

pythpi

  

根据上图的代码,我们自定义了一个正则转换器(34行),使用该转换器对年份做了一个简单的匹配,这里只匹配了四位数字(43行),如果url的年份参数写4位数字,就可以正确路由,否则会找不到该路由。总结一下,在flask中使用正则的步骤如下:

  1. 导入转换器基类,BaseConverter,见31行
  2. 自定义转换器类,见34行,转换器类继承了转换器基类,并且会把第一个参数作为匹配规则进行匹配,见37行
  3. 添加转换器到默认的转换器字典中,见40行,这里在字典中新增了一个键regex
  4. 使用转换器实现你要匹配的规则,见43行
  • 构建url地址

有的时候需要在一个页面上跳转到另一个页面,那就需要获取另一个页面的url路由地址,我们可以把地址直接硬编码在页面上面,但是这样并不灵活,尤其是另一个页面的url路由也需要可变参数的时候,硬编码就没有办法了。更好的办法是在后台生成另一个页面的url地址,这个时候就要用到一个新的方法url_for了。具体使用见下图:

pythpi

在上面的代码中,我们首先导入了url_for方法,代码第一行。url_for方法的原型如下:

def url_for(endpoint, **values),endpoint就是路由的结点,传递视图方法的字符串即可,后面的values就是视图方法的参数,注意要写成关键字参数的形式,见代码第八行。最后返回给页面内容的时候,我们加了一个超链接的标签,这个标签的href属性值就是url_for返回的需要跳转页面地址。

url_for除了用于生成页面上要跳转的url路由外,还可以生成重定向的url。比如一个视图里面需要根据不同的条件重定向到不同的页面,可以配合redirect和url_for进行重定向。比如在小王的项目中,同样是访问某一个路由,但是管理人员和普通用户实际看到的页面并不一样,管理人员可能会跳转到后台管理系统,普通用户看到的就是一个展示页。具体代码见下图。

py

运行服务器,在浏览器输入http://127.0.0.1:5000/user_login/test,就会跳转到http://127.0.0.1:5000/index页面,如果输入http://127.0.0.1:5000/user_login/admin,就会跳转到http://127.0.0.1:5000/admin页面。

 

“好了,这些就是关于flask路由的内容,有了这些内容,相信你就可以先把网站的路由系统做起来了。你今天的任务就是规划车辆识别系统的整个路由,然后把路由以及处理的视图先写出来,因为还没有页面,页面信息就用视图返回的字符串替代就可以了。”老项讲完,就把当天的任务给小王布置了。

小王说:“我提前用脑图理好了一个网站地图,我就按照这个网站地图先把整个路由的框架写好吧。”说完,看了看时间,差不多也要上班了,和老项道了个谢,就到自己的工作岗位上去了。

 

本章任务:

按照老项的要求,配合下面的网页地图,构建汽车识别系统的路由系统和简易视图。

;