有故事,带项目的flask教程(2)---flask的路由管理_flask路由集中管理-程序员宅基地

技术标签: python  flask教程  故事  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路由的内容,有了这些内容,相信你就可以先把网站的路由系统做起来了。你今天的任务就是规划车辆识别系统的整个路由,然后把路由以及处理的视图先写出来,因为还没有页面,页面信息就用视图返回的字符串替代就可以了。”老项讲完,就把当天的任务给小王布置了。

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

 

本章任务:

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bbright3493/article/details/90768183

智能推荐

kubeadm安装的k8s 证书过期升级为100年证书_k8s v1.20.15修改证书过期时间为100年-程序员宅基地

使用重新编译的100年版本的kubeadm程序替换原有的一年kubeadm,重启部分k8s组件1、备份配置文件kubectl get cm -o yaml -n kube-system kubeadm-config >/root/kubeadm_20211222.yaml2、备份证书cd /etc/cp -ar kubernetes kubernetes.bak.20211222tar -czf kubernetes.tar.gz.20211222 kubernetes3、_k8s v1.20.15修改证书过期时间为100年

Vue面试题_vue 面试题-程序员宅基地

整理面试题,不仅仅为了面试,也在深入理解,共勉_vue 面试题

Stanford机器学习---第十讲. 数据降维-程序员宅基地

本栏目(Machine learning)包括单参数的线性回归、多参数的线性回归、Octave Tutorial、Logistic Regression、Regularization、神经网络、机器学习系统设计、SVM(Support Vector Machines 支持向量机)、聚类、降维、异常检测、大规模机器学习等章节。内容大多来自Standford公开课machine learning中An

回溯法——01背包问题和最大团问题_01背包并且记录最优解组合-程序员宅基地

题目还给出一种思想,为了方便计算上界(即cp+r>当前bestp的最大值情况),我们可以将这个解空间树的结点按照单位价值(性价比)从大到小进行排序,这样每深入一层,我们每次加入的总是最大性价比的物品,因为我们优先加入性价比高的,这样算出来的解一定是最优的,也尽可能的减少了遍历长度,省去了其他多余的剪枝步骤。那么在根据题目要求,一个图的团需要满足它是一个完全子图,并且不被更大的完全子图包含。然后需要我们求出这个图G的最大团,如果像如图给出的例子有三种最大团,也就是说最大团也不唯一。_01背包并且记录最优解组合

UnicodeDecodeError: 'utf-8'错误_contents = fp.read() + '\n' unicodedecodeerror: 'u-程序员宅基地

UnicodeDecodeError: 'utf-8’错误1.执行代码#!/usr/bin/pythonimport urllib.request;# 打开网页response = urllib.request.urlopen('http://www.680.com/gongsi/477139.html');# 输出页面内容print(response.read().d..._contents = fp.read() + '\n' unicodedecodeerror: 'utf-8

随便推点

opencv(30)---特征检测与匹配(1)---SIFT特征点提取-程序员宅基地

基本概念特征点的检测和匹配是计算机视觉中非常重要的技术之一, 在物体识别、视觉跟踪、三维重建等领域都有很广泛的应用。OpenCV提供了如下几种特征检测方法:“FAST”——FastFeatureDetector“STAR”——StarFeatureDetector“SIFT”——SIFT(nonfree module)“SURF”——SURF(nonfree module)“ORB”——O

关系数据库语言SQL课后练习题(二)_统计有学生选修的课程门数-程序员宅基地

关系数据库语言SQL课后练习题(二)提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录关系数据库语言SQL课后练习题(二)前言一、题目二、解题步骤2.1 统计有学生选修的课程门数。2.2 求选修C4课程的女学生的平均年龄。2.3 求LIU老师所授的每门课程的平均成绩。2.4 统计选修每门课程的学生人数(超过l0人的课程才统计)。要求显示课程号和人数,查询结果按人数降序排列,若人数相同,则按课程号升序排列。2.5 检索学号比WANG同学大,而年龄比他小的学生姓名。2.6 在表SC中_统计有学生选修的课程门数

问题 L: 【分治】第k小整数II_老板的新规则是:对于两个有序数组a[n]和a[m](1<n,m<100000),找出第k小的数。-程序员宅基地

你的忏悔或许会让你心安,但未必别人如此。题目描述“哇!好多冰淇淋啊!”张琪曼拉着李旭林又跑到学院的冷饮店,问:“老板,这次你要第k小魔法石?”老板笑着说:“我要……咦,你们实现把魔法石都排好了?那可不行,这不赖皮嘛,我要改下规则。”老板的新规则是:对于两个有序数组a[n]和a[m](1<n,m<100000),找出第k小的数。输入第一行三个整数n、m、k。第二..._老板的新规则是:对于两个有序数组a[n]和a[m](1<100000),找出第k小的数。

高斯分布2——多维高斯分布_二维高斯分布函数与椭圆的区别-程序员宅基地

惯例依旧是手写版本文推导了为什么二维高斯分布等高线是圆或椭圆,且等高线上的概率相等!_二维高斯分布函数与椭圆的区别

POJ 1611 The Suspects 并查集-程序员宅基地

The SuspectsDescriptionSevere acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recog...

18.$nextTick_ue的 nexttick 原理-程序员宅基地

如上图,实现这个功能。当我们点击按钮的时候,让input框显示并且让它自动对焦。代码 :<template> <div class="hello"> <button v-if='isShowButton' @click="setButton">show input</button> <input ref="input" v-else type="text"> </div></temp.._ue的 nexttick 原理