《Flask Web 开发指南 pt.2》

哈喽大家好,我是咸鱼

《Flask Web 开发指南 pt.1》中,咸鱼跟大家介绍了 Flask 的由来——诞生于一个愚人节玩笑,简单介绍了一些关于 Flask 的概念,并且编写了一个简单的 Flask 程序

在编写 Flask 程序的时候,你需要注意你的程序文件不要命名为 flask.py,建议命名为 app.py 或者 wsgi.py

但如果你的程序不是叫 app.py 或者 wsgi.py,那么你就需要设置环境变量 FLASK_APP 的值为程序名字

设置环境变量有两种方法,在《开发指南 pt.1》有提到,大家可以去看一下

 运行环境

我们知道,代码的运行环境一般分为开发环境和生产环境

开发环境指的是我们在本地编写和测试程序时的计算机环境

而生产环境也叫线上环境,指的是程序部署在互联网能够对外提供服务且供用户使用的环境

在 Flask 中,Flask 会根据运行环境的不同来改变相应的行为和设置,建议小伙伴们在编写 Flask 程序的时候将运行环境设置成开发环境

因为在开发环境下,Flask 会开启调试模式(Debug Mode),这时候执行 flask run启动程序会激活 Werkzeug 内置的调试器和重载器,这能更好地帮助我们去 debug

  • 调试器(debugger)

当你的程序报错时,网页会生成详细的错误信息,而调试器允许你在错误页面上执行代码

首先单击错误信息右侧的命令行图标,然后会弹出一个窗口要求你输入 PIN 码,这个 PIN 码在你执行 flask run 命令的时候程序会给你

 

 

输入 PIN 码之后,点击错误堆栈的某个节点右侧的命令行图标,就会出现一个包含代码执行上下文信息的 Python Shell

  • 重载器(reloader)

重载器的作用就是检测程序文件的变动,然后重启。当修改了代码之后,你会在终端看到下面的输出

这意味着每次修改完代码不需要手动重启 flask 程序

PS

网上有些 flask 教程可能告诉你按照下面的方式将 Flask 运行环境将设置成开发环境

这个环境变量在早期版本的 flask 中是适用的,但是后面被弃用了,不建议使用这个环境变量,否则可能会 warning

 

 相关链接:https://github.com/docker/docs/issues/15571

URL 路由

注册路由

 

在上面这段代码中,我们通过 route() 装饰器将根地址与 index() 函数绑定在一起,当用户访问

http://localhost:5000/ 的时候,就会显示 index 函数的返回结果 '<h1>Hello,Flask!</h1>'

通过 route() 装饰器将 URL 与函数建立关联的这个过程叫做注册路由,路由负责管理 URL 与函数之间的映射

即我访问哪个 URL (前提是这个 URL 已经与函数建立起了关联),Flask 就去对应的函数下执行并返回结果给我

这个函数被称作视图函数,视图函数返回的结果不仅仅是一串字符串这么简单,它还能够返回各种链接、表单、HTML 文件等等

上面的代码中,'/' 为相对 URL,index() 函数为视图函数

一个 Web 程序其实就是用户点击不同的 URL 链接,程序内部去执行对应的函数然后返回对应的结果给用户。可以说,大部分 Flask 的基本模式就是这一个个注册路由的实现

为一个视图函数绑定多个 URL

现在无论是访问 http://localhost:5000/http://localhost:5000/home 还是 http://localhost:5000/index ,返回的都是同一个值

动态URL

除此之外,我们还可以在 URL 里定义变量,实现动态 URL

添加变量使用 <变量名> 的形式

例如 /user/<name> ,flask 在处理请求时会把这个变量传入视图函数里面

上面的代码中 user_page() 视图的 URL 为 /user/<name>,那么像 /user/edison、/user/fish 的请求都会触发这个函数

 

但是如果你访问的时候没有添加变量(比如访问 /user ),那么会返回一个 404 错误,该如何解决呢?

常见的方法是设置默认值,当访问的 URL 里面没有带变量时,就会使用默认值。设置默认值有两种方法:

  • 在装饰器里面使用 default 参数添加默认值

请注意,你需要添加两条 URL 规则,这样当用户访问 /user 时 flask 才能找到对应的视图函数

  • 在视图函数里面添加默认值

对于 URL 变量,flask 支持在 URL 里对变量设置处理器,对变量进行预处理

 转换器类型:

关于 URL 后面带斜杠的问题

这是一个常见但是也容易混淆的问题

上面的代码里面,这两条 URL 的尾部一个添加了斜杠一个没有添加,有什么区别呢?

  • projects() 视图函数的 URL 尾部有一个斜杠,路径看起来像一个目录。如果你访问 /projects,Flask 会自动帮你重定向到 /projects/  ,即无论是访问/projects/  还是 /projects ,都能正常返回

  • about() 视图函数的 URL 尾部没有斜杠,路径看起来像一个文件。如果你访问 /about/  ,Flask 会返回一个 404 错误。因为这样可以保持 URL 唯一,并帮助搜索引擎避免重复索引同一页面

端点

上面我们讲过,在编写 Flask 程序的时候会将 URL 与 视图函数进行关联(注册路由)

即通过将不同 URL 关联到不同的视图函数上,以此来实现不同的业务逻辑

但其实在 Flask 中,URL 首先被映射到端点上,然后再映射到视图函数

端点通常用来标记一个视图函数以及对应的 URL,默认值是视图函数的函数名

 在上面的代码中,端点即视图函数的名称hello

当然你也可以修改端点名(通常不建议这么做)

当访问 hhttp://localhost:5000/hello 时,URL 首先映射到端点 say_hello 上,然后与端点 say_hello 相关联的视图函数 hello() 就会处理这个请求

在 web 程序中,URL 无处不在。如果我们在编写 web 程序的时候使用 URL 都是用硬编码方式,那么就会大大降低代码的易用性

硬编码是指在写代码过程中将变量用一个固定数值表示,如果后续想要修改这个变量就非常困难

比如在 flask 中,如果你修改了某个路由的 URL,那么在其他调用到这个 URL 的视图函数里面的 URL 都需要修改,很麻烦

一个常用的解决方法就是使用 Flask 中的 url_for() 函数来获取 URL

url_for() 函数中第一个参数为端点,这说明端点通常用作反向查询 URL 地址

在上面的代码中,端点即视图函数的函数名 index,通过调用 url_for() 函数就可以获得对应的 URL

如果你的视图函数绑定的是动态 URL,那么需要在 url_for() 函数中添加相关参数

上面所说的 URL 都是相对 URL(URL 中的 path 部分),如果你想获得绝对 URL,需要在 url_for() 函数中添加相关参数 _external=True


感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力!

0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • 1. 背景商家系统是提供给得物商家在得物平台上可以稳定运营的服务抓手,前端代码也伴随着系统的发展而不断壮大。这样将导致文档却更新不及时,最后想再通过这些文档回溯业务逻辑也非常困难。且若代码结构上没有关...

  • 背景随着前端技术发展,已经转变为数据绑定为主流的框架方式,与后端服务一样,前端代码实现也会涉及相互依赖,引用这些场景,那么应该如何准确的评估前端代码改动的影响范围?依赖开发评估?依靠经验评估?或者直接...

  • 图片来源:cdn77.com本文作者:xsy前端应用的 bundle 体积是影响应用性能的主要方面之一,我们看下取自 HTTP Archive - Loading Speed 的两幅截图大概是得益于设...

  • WEB开发会话技术01 1.会话 Web开发中,用到的4种会话跟踪技术 - 博客园 (cnblogs.com) 会话的基本介绍 什么是会话? 会话可简单理解为:用户开一个浏览器,点击多个超链接...

  • 大家好,我是 Kagol,Vue DevUI 作者,从2020年开始一直专注于前端开源组件库的建设,在前端开源组件库、开源社区运营方面积累了一些经验,2020年主要的创作也是围绕前端组件库和开源两个主...

  • 一、文章背景笔者是2023届双非一本软件工程专业准毕业生,于2022年8月份开始秋招,后陆续收到去哪儿旅行、京东(即时配送)、猫眼娱乐等企业的Offer。在“互联网寒冬”下:见好就收、结束秋招。因此,...

  • 做前端中台业务一年多的时间,有一些心得体会,和大家分享分享。中台是什么中台业务的价值是什么做了哪些前端中台业务如何设计前端中台业务未来展望中台是什么百度百科的解释比较言简意赅:“中台,互联网术语,一般...

  • 背景 如今很多网站都引入截图功能,可用于问题反馈、内容分享等实用需求,而前端截图也不知不觉成为了首选。今天为大家推荐两种前端截图方式,虽然有些局限,但是也能应付大部分项目需求。 Canvas截图:h...

  • 一、导读“异常”一词出自《后汉书.卷一.皇后纪上.光烈阴皇后纪》,表示非正常的,不同于平常的。在我们现实生活中同样处处存在着异常,比如小县城里的路灯年久失修、上下班高峰期深圳的地铁总是那么的拥挤、人也...

  • 与其说 Serverless 架构是一个新的概念,不如说它是一种全新的思路,一种新的编程范式。但是原生的 Serverless 开发框架却非常少。以 Web 框架为例,目前主流的 Web 框架“均不支...

  • 之前码过很多低代码的文章,发现大家口中的低代码挺不一样的,这次心血来潮想探探低代码的野路子。 只需要拖拽操作或者几行基础代码,就能完成以往需要程序员才能搭建的各类应用系统,对效率要求较高的企业而言...

  • 作者:vivo 互联网安全团队- Gui Mingcheng 本文介绍了两种攻击者无需直接接触服务端即可攻击和影响用户行为的安全漏洞 —— Web缓存污染与请求走私。Web缓存污染旨在通过攻击者向缓...

  • 环境 odoo-14.0.post20221212.tar Web Controllers Controllers 控制器需要提供可扩展性,就像Model,但不能使用相同的机制,因为先决条件(已加载模...

  • 在这个系列文章里,我尝试将自己开发唯一客服系统(gofly.v1kf.com)所涉及的经验和技术点进行梳理总结。 文章写作水平有限,有时候会表达不清楚,难免有所疏漏,欢迎批评指正 该系列将分成以下几...

  • 欢迎阅读本系列其他文章 【前端调试】- 更好的调试方式 VSCode Debugger 【前端调试】- 断点调试的正确打开方式 介绍 首先简单过一下Performance的使用,打开网页点击控制台Pe...

  • 前言 在微前端实践过程中有一个必然会遇到的问题:全局作用域变量的污染问题,具体来说就是window对象挂载数据会被主子应用获取和修改导致数据相互污染问题,这时候如果能在应用之间做个数据隔离,最好能实现...

  • 一般的Web项目中都少不了登录这个环节,登录之后就需要跳转到首页,并且根据 当前用户的信息,获取到对应的菜单信息,可以操作的方法信息等等。这个只是针对于 操作权限,至于数据权限处理起来会更加复杂一些。...

  • 在现代的B/S架构应用中,我们会做前后端分离,某些前端Web服务会将编译完成的静态文件放到一个web服务器进行部署。例如,我的博客也是基于Hugo编译的静态文件来进行部署的。那在容器化部署模式下,我们...

  • 我们是由一线互联网公司的前端技术专家及架构师所组成的培训团队,主要面向工作多年但拿不到理想 offer 或者是想要找一份优质高薪的远程工作的同学。我们团队拥有完备的大厂最前沿的前端技术和丰富的大型复杂...

  • 多病用一个词总结我的2022 ,毫无疑问是【多病】。翻看挂号记录,今年累计跑了19次医院,除去定期的脱发复查、尿常规复查外,其他还得了皮肤病、急性咽炎、筋膜炎、结膜炎、肾结石、慢性胃炎、胸闷,体验过了...