当前位置: 首页 > news >正文

《Flask入门教程》学习笔记

《Flask入门教程》官网:https://tutorial.helloflask.com/

目录

  • 第一章:准备工作
  • 第二章:Hello, Flask!
  • 第三章:模板
  • 第四章:静态文件
  • 第五章:数据库
  • 第六章:模板优化
  • 第七章:表单
  • 第八章:用户认证
  • 第十章:组织你的代码
  • 第十一章:部署上线

第一章:准备工作

使用下面的命令即可为当前项目创建一个虚拟环境:python -m venv env。这会在当前目录创建一个包含 Python 解释器环境的虚拟环境文件夹,名称为 env。

使用下面的命令来激活虚拟环境:env\Scripts\activate。这时命令提示符前会显示虚拟环境的名称,表示已经激活成功。

第二章:Hello, Flask!

Flask 是典型的微框架,作为 Web 框架来说,它仅保留了核心功能:请求响应处理和模板渲染。这两类功能分别由 Werkzeug(WSGI 工具库)和 Jinja(模板渲染库)完成。

在项目根目录执行flask run,Flask将会使用内置的开发服务器运行同目录下的app.py,浏览器输入http://localhost:5000/即可访问。

视图函数(view funciton):
(1)在Flask 程序app.py中注册。视图函数可以理解为“请求处理函数”。注册的方法是使用 @app.route() 装饰器来为函数绑定对应的 URL。
(2)一个视图函数也可以绑定多个 URL,这通过附加多个装饰器实现。
(3)URL中的变量用尖括号对<>包裹,视图函数头中需声明同名变量,在函数体中用字符串引号对中的花括号对访问变量,使用markupsafe.escape(s)进行转义处理,如return f'User: {escape(name)}'(注意不要漏掉f)。
(4)视图函数的名称可以作为代表某个路由的端点(endpoint),同时用来生成视图函数对应的 URL。Flask 提供了一个 url_for 函数来生成 URL。

管理环境变量:执行pip install python-dotenv。在根目录下创建2个文件:.flaskenv.env。当 python-dotenv 安装后,Flask 会从这2个文件读取环境变量并设置。.flaskenv 用来存储 Flask 命令行系统相关的公开环境变量;而 .env 则用来存储敏感数据,不应该提交进 Git 仓库(添加到.gitignore)。

开启调试模式:在 .flaskenv 文件里,写入一行 FLASK_DEBUG=1。调试模式开启后,当程序出错,浏览器页面上会显示错误信息;代码出现变动后,程序会自动重载(但是页面需要手动刷新)。

第三章:模板

包含变量和运算逻辑的 HTML 或其他格式的文本叫做模板,执行这些变量替换和逻辑计算工作的过程被称为渲染,这个工作由模板渲染引擎Jinja2来完成。

默认情况下,Flask 会从程序同级目录的 templates 文件夹中寻找模板。

模板基本语法:

  • {{ ... }} 用来标记变量。
  • {% ... %} 用来标记语句,比如 if 语句,for 语句等。
  • {# ... #} 用来写注释。

为了方便对变量进行处理,Jinja2 提供了一些过滤器,通过在变量名后附上|过滤器名来使用。

渲染模板:render_template(template_name,context) ,其中template_name为模板文件名(相对于 templates 根目录的文件路径),context为模板内变量(可以有多个)。

进阶:使用 Faker 可以实现自动生成虚拟数据

第四章:静态文件

静态文件(static files)指的是内容不需要动态生成的文件。比如图片、CSS 文件和 JavaScript 脚本等。静态文件保存在与程序同目录的static文件夹中。

在 HTML 文件里,引入这些静态文件需要给出资源所在的 URL。这些文件的 URL 可以通过 Flask 提供的 url_for() 函数来生成。

添加图片:建议把图片放在static/images中。

添加 CSS:可以借助前端框架来完善页面样式,比如 Bootstrap、Semantic-UI、Foundation 等。它们提供了大量的 CSS 定义和动态效果,使用起来非常简单。

第五章:数据库

SQLAlchemy是一个 Python 数据库ORM工具。定义 Python 类来表示数据库里的一张表,通过对这个类进行各种操作来代替写 SQL 语句。这个类称为模型类,类中的属性称为字段。

安装:pip install flask-sqlalchemy==2.5.1 sqlalchemy==1.4.47

初始化:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)  # 传入程序实例 app

设置数据库 URI:app.config['SQLALCHEMY_DATABASE_URI']=...

定义模型类:模型类要声明继承 db.Model。每一个类属性(字段)要实例化 db.Column,传入的参数为字段的类型(Integer, String (size), DateTime, Float)。在 db.Column() 中可以添加额外的选项,比如primary_key=True,nullable=False,unique=True、default=...等。

数据库文件(*.db)不需要提交到 Git 仓库。

向数据库中添加记录:创建模型对象obj,调用db.session.add(obj),然后调用db.session.commit()提交更改。

查询数据库记录:<模型类>.query.<过滤方法(可选)>.<查询方法>。如Movie.query.filter_by(title='Mahjong')Movie.query.filter(Movie.title=='Mahjong'),这两条查询是等价的。

参照完整性: 可查阅Flask-SQLAlchemy 文档的“声明模型”章节。

第六章:模板优化

对于多个模板内都需要使用的变量,可以使用 app.context_processor 装饰器注册一个模板上下文处理函数。这个函数返回的变量(以字典键值对的形式)将会统一注入到每一个模板的上下文环境中,因此可以直接在模板中使用。

对于模板内容重复的问题,Jinja2 提供了模板继承的支持。父模板一般被称为基模板(base template),基模板中包含完整的 HTML 结构和导航栏、页首、页脚等通用部分。在子模板里使用 extends 标签来声明继承自某个基模板。

基模板中需要在实际的子模板中追加或重写的部分则可以定义成(block)。块使用 block 标签创建, {% block 块名称 %} 作为开始标记,{% endblock %}{% endblock 块名称 %} 作为结束标记。通过在子模板里定义一个同样名称的块,可以向基模板的对应块位置追加或重写内容。默认的块重写行为是覆盖,如果你想向父块里追加内容,可以在子块中使用 super() 声明,即 {{ super() }}

【提示】因为基模板会被所有其他页面模板继承,如果你在基模板中使用了某个变量,那么这个变量也需要使用模板上下文处理函数注入到模板里。

第七章:表单

当表单中的提交按钮被按下,请求会默认发往当前 URL,在<form>元素使用 action 属性自定义目标 URL。

视图默认只接受 GET 请求,因此对于POST请求,需要在@app.route中指定methods=['GET', 'POST']

Flask 会在请求触发后把请求信息放到 request 对象里,只能在视图函数内部调用它。它包含请求相关的所有信息,比如请求的路径(request.path)、请求的方法(request.method)、表单数据(request.form,是一个特殊的字典)、查询字符串(request.args)等等。

flash() 函数用来在视图函数里向模板传递提示消息(把消息存储到session里),get_flashed_messages() 函数则用来在模板中获取提示消息。

Flask 提供的 session 对象用来在请求间存储数据,它会把数据签名后存储到浏览器的 Cookie 中。设置签名所需的密钥:app.config['SECRET_KEY'] = 'dev'(这个密钥的值在开发时可以随便设置。基于安全的考虑,在部署时应该设置为随机字符)

redirect() 函数用于生成重定向响应,传入重定向的目标 URL 作为参数。

为了安全的考虑,一般使用 POST 请求来提交删除请求,也就是使用表单来实现(而不是创建删除链接)。为了让表单中的删除按钮和旁边的按钮排成一行,需要为表单元素添加CSS 定义:.inline-form {display: inline;}

【提示】 对于复杂的程序,一般会使用集成了 WTForms 的扩展 Flask-WTF 来简化表单处理。通过编写表单类,定义表单字段和验证器,它可以自动生成表单对应的 HTML 代码,并在表单提交时验证表单数据,返回对应的错误消息。更重要的,它还内置了 CSRF(跨站请求伪造) 保护功能。 使用 Flask-WTF 时,表单类在模板中的渲染代码基本相同,可以编写宏来渲染表单字段。如果你使用 Bootstap,那么扩展 Bootstrap-Flask 内置了多个表单相关的宏,可以简化渲染工作。

第八章:用户认证

Flask 的依赖 Werkzeug 内置了用于生成和验证密码散列值的函数,werkzeug.security.generate_password_hash() 用来为给定的密码生成密码散列值,而 werkzeug.security.check_password_hash() 则用来检查给定的散列值和密码是否对应。

使用 Flask-Login 实现用户认证:
(1)安装:pip install flask-login
(2)实例化扩展类:login_manager = LoginManager(app)
(3)实现一个“用户加载回调函数”。该函数的返回值会存储在Flask-Login的current_user 变量中。
(4)让存储用户的模型类继承 Flask-Login 提供的 UserMixin

用户登录使用 Flask-Login 提供的 login_user() 函数实现,需要传入用户模型类对象作为参数。登出操作则需要调用 logout_user() 函数。

认证保护:在 Web 程序中,有些页面或 URL 不允许未登录的用户访问,而页面上有些内容则需要对未登陆的用户隐藏,这就是认证保护。对于不允许未登录用户访问的视图,只需要为视图函数附加一个 @login_required 装饰器就可以将未登录用户拒之门外。添加了这个装饰器后,如果未登录的用户访问对应的 URL,Flask-Login 会把用户重定向到登录页面,并显示一个错误提示。为了让这个重定向操作正确执行,还需要把 login_manager.login_view 的值设为我们程序的登录视图端点(函数名)。

第十章:组织你的代码

创建一个包,然后把 app.py 中的代码按照类别分别放到多个模块里。

模块作用
__init__.py包构造文件,创建程序实例
views.py视图函数
errors.py错误处理函数
models.py模型类
commands.py命令函数

包构造文件:存放创建程序实例、初始化扩展的代码。在函数内导入模型类,在文件结尾导入包中的其他模块。

其他文件:使用app变量之前,需要from 包名 import app

【提示】《Flask Web 开发实战》第 8 章介绍了大型项目结构以及如何使用蓝本和工厂函数组织程序。

第十一章:部署上线

生成依赖列表:pip freeze > requirements.txt

把需要在生产环境下使用的配置改为优先从环境变量(.env文件)中读取,如果没有读取到,则使用默认值:

app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'dev')
app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(os.path.dirname(app.root_path), os.getenv('DATABASE_FILE', 'data.db'))

在项目根目录创建一个 wsgi.py 脚本,在这个脚本中加载环境变量,并导入程序实例以供部署时使用。

相关文章:

《Flask入门教程》学习笔记

《Flask入门教程》官网&#xff1a;https://tutorial.helloflask.com/ 目录 第一章&#xff1a;准备工作第二章&#xff1a;Hello, Flask!第三章&#xff1a;模板第四章&#xff1a;静态文件第五章&#xff1a;数据库第六章&#xff1a;模板优化第七章&#xff1a;表单第八章&a…...

go语言基础 -- map的定义与使用

map的定义与使用 map声明基础语法map的基本使用map的遍历map切片map排序 map声明基础语法 // map的声明 var xxx_map map[key_type]value_typemap的key可以是基本数据类型&#xff0c;channel&#xff0c;接口&#xff0c;结构体&#xff0c;数组&#xff0c;但不能是slice&am…...

讯方·智汇云校第五期名师班火热报名中!

第三期名师班回顾 授课情况 课堂上&#xff0c;同学们热情高涨&#xff0c;积极参与互动。他们紧跟名师的步伐&#xff0c;深入探索云服务的奥秘。张梁老师在为同学们讲述完知识点后&#xff0c;会根据所讲知识给同学们布置对应的实验&#xff0c;由同学们分组讨论练习。 每…...

为什么企业需要使用云电子邮箱?

作为一家机构的负责人&#xff0c;您比大多数人都清楚&#xff0c;您的工作日不会在下午5点就结束。很可能&#xff0c;当您的员工已经打卡下班回家很久之后&#xff0c;您还在以这样或那样的方式继续工作。作为一名企业主&#xff0c;埋头苦干对您来说并不是什么新鲜事&#x…...

[DEBUG] spring boot-如何处理链接中的空格等特殊字符

问题&#xff1a; get或者post中提交的内容可能有空格、#等特殊字符&#xff0c;不做处理的话可能解析错误。 解决&#xff1a; html中&#xff1a; <a th:href"{/listSgrna(id${item.getGeneId()},geneName${item.getGeneName()},genome${genome},sgrnaNum${sgrnaN…...

通过配置数据库事件(Event)来实现定时导出 MySQL 数据库

首先&#xff0c;确保 MySQL 服务器已启用事件调度器功能。你可以通过以下 SQL 语句查询&#xff1a; SHOW VARIABLES LIKE event_scheduler; 如果 event_scheduler 的值为 ON&#xff0c;则表示事件调度器已启用&#xff1b;如果为 OFF&#xff0c;则可以使用以下语句启用&…...

基于x86架构的OpenHarmony应用生态挑战赛等你来战!

为了更快速推进OpenHarmony在PC领域的进一步落地&#xff0c;加快x86架构下基于OpenHarmony的应用生态的繁荣&#xff0c;为北向应用开发者提供一个更加便捷的开发环境&#xff0c;推动OpenHarmony北向应用开发者的增加&#xff0c;助力OpenHarmony在PC领域实现新的突破&#x…...

LeetCode每日一题2673. Make Costs of Paths Equal in a Binary Tree

文章目录 一、题目二、题解 一、题目 You are given an integer n representing the number of nodes in a perfect binary tree consisting of nodes numbered from 1 to n. The root of the tree is node 1 and each node i in the tree has two children where the left ch…...

贝叶斯分类器

贝叶斯分类器 1. 引言 贝叶斯分类器是一种基于贝叶斯定理的分类算法&#xff0c;它利用特征之间的关系和类别的先验概率来进行分类。贝叶斯分类器在文本分类、垃圾邮件过滤、医学诊断等领域有着广泛的应用。 贝叶斯分类算法是统计学的一种分类方法&#xff0c;是一类利用概率…...

游戏服务之会话管理

会话的概念与作用 游戏服务器 Session(会话)是指在游戏服务器和客户端之间建立的一个临时的连接。它可以用于存储和管理用户的游戏状态和信息。 当用户登录游戏时,服务器会为该用户创建一个 Session,可用于记录用户的登录状态、角色信息等个人信息。服务器会为每个会话分…...

LeetCode20 有效的括号

题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对应的相…...

sql实战_基于某推荐比值问题

将一个月内某PL对应的MBLX出现的最高的频次的占比值最大的值统计出来&#xff0c;并且还要把XHLX&#xff0c;MBLX字段添加上作为最终的推荐字段 Select * from(select *,row_number( ) over (partition by PL order by 占比最大值 desc ) rn from 表) where rn 1&#xff1b…...

协议的概念+本质+作用+最终表现形式,网络问题(技术+应用+解决的协议+存在原因),主机的对称性

目录 协议 概念 示例 -- 摩斯密码 介绍 作用 协议的本质 作用 网络问题 引入 技术问题 应用问题 主机的对称性 问题对应的协议 问题出现的原因 理解协议(代码层面) 举例 -- 快递单 协议的最终表现形式 协议被双方主机认知的基础 协议 概念 协议是在计算机通信…...

iOS中卡顿产生的主要原因及优化思路

卡顿本质上是一个UI体验上的问题&#xff0c;而UI的渲染及显示&#xff0c;主要涉及CPU和GPU两个层面。若 CPUGPU渲染耗时超过16.7ms&#xff0c;就会在屏幕vsync信号到来时无法更新屏幕内容&#xff0c;进而导致卡顿。 iOS中UI渲染主要包含Layout->Draw->Prepare->Co…...

spring boot集成Elasticsearch 7.16.3

环境&#xff1a;Elasticsearch 版本 7.16.3 Elasticsearch for windows下载地址 windows 若依 spring boot版本 2.6.0 pom文件添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch<…...

HTML5+CSS3小实例:环绕小球弹性loading动画

实例:环绕小球弹性loading动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge&quo…...

SpringBoot 自定义注解实现操作日志记录

文章目录 前言正文一、项目结构介绍二、核心类2.1 核心注解2.1.1 CLog 日志注解2.1.2 ProcessorBean 处理器bean 2.2 切面类2.3 自定义线程池2.4 工具类2.4.1 管理者工具类 2.5 测试2.5.1 订单创建处理器2.5.2 订单管理者2.5.3 订单控制器2.5.4 测试报文2.5.5 测试结果 附录1、…...

ubuntu常见配置

ubuntu各个版本的安装过程大差小不差&#xff0c;可以参考&#xff0c;ubuntu20.04 其它版本换一下镜像版本即可 安装之后需要配置基本的环境&#xff0c;我的话大概就以下内容&#xff0c;后续可能有所删改 sudo apt-get update sudo apt-get install gcc sudo apt-get inst…...

electron+vue3全家桶+vite项目搭建【27】封装窗口工具类【1】雏形

文章目录 引入思路抽出公共声明文件抽出全局通用数据类型和方法主进程模块1.抽离基础常量2.封装窗口工具类 渲染进程模块测试结果 引入 demo项目地址 可以看到我们之前在主进程中的逻辑全部都塞到index.ts文件中&#xff0c;包括窗口的一些事件处理&#xff0c;handle监听&am…...

从模型到复合AI系统的转变

2023年,大型语言模型(LLM)吸引了所有人的注意力,它可以通过提示来执行通用任务,例如翻译或编码。这自然导致人们将模型作为AI应用开发的主要成分而密切关注,所有人都在想新的LLM将带来什么能力。然而,随着越来越多的开发者开始使用LLM构建,我们认为这种关注正在迅速改变:最先进…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...