Flask 进阶
Flask Web 开发读书笔记 - [美] 米格尔.格林贝尔
山药鱼儿
夫学须静也,才须学也,非学无以广才,非志无以成学
展开
-
《Flask Web开发》读书笔记索引
完整代码注:本书没有涉及太多原理性的内容,实践性非常强,适合快速入门~git clone git@github.com:MiaLi0521/FlaskyEasyDemo.git目录第一章 安装https://blog.csdn.net/Geroge_lmx/article/details/104028500第二章 FLASK应用的基本结构(一)https://b...原创 2020-03-12 16:42:04 · 188 阅读 · 0 评论 -
第一章 搭建 Flask 开发环境
一. 初识FlaskFlask的核心即简单且易于扩展,所以被称为微框架。Flask有3个主要依赖:Werkzeug:提供路由、调试和WEB服务网关接口(WSGI)子系统; Jinjia2:模板引擎; Click:命令行集成;Flask只保留了WEB开发的核心,其他的功能都有外部扩展来实现,如数据库集成、表单验证,用户身份验证等。(备注:WSGI是Python中用来规定WEB服务器如何...原创 2020-01-18 12:23:58 · 379 阅读 · 0 评论 -
第二章 FLASK应用的基本结构(一)
一. 初始化所有Flask应用都须要创建的一个应用实例:from flask import Flaskapp = Flask(__name__)Flask构造函数的唯一参数:应用主模块或包的名称,通常情况下__name__变量就是所需的值。二. 路由和视图函数Web客户端 -------> Web服务器 -------> Flask应用实例 -------&g...原创 2019-08-10 17:37:56 · 480 阅读 · 0 评论 -
第二章 Flask应用的基本结构(二)
一. Web开发服务器Flask应用自带Web开发服务器,通过flask run命令启动。这个命令在FLASK_APP环境变量指定的python脚本中寻找应用实例:# hello.pyfrom flask import Flaskapp = Flask(__name__)@app.route('/')def index(): return '<h1>Hell...原创 2019-08-11 20:40:17 · 284 阅读 · 0 评论 -
第三章 Jiaja2模板引擎(一)
业务逻辑和表现逻辑混在一起会导致代码难以理解和维护,因此Flask将表现逻辑移到模板中以提升应用的可维护性。下面以网站注册账户为例,说明一下什么是业务逻辑,什么是表现逻辑:业务逻辑:服务器收到包含用户输入的请求,然后把Flask请求分派给视图函数,这个视图函数需要访问数据库,添加新用户; 表现逻辑:业务逻辑结束后,生成响应会送浏览器; 其中模板是包含响应文本的文...原创 2019-08-12 11:22:12 · 591 阅读 · 1 评论 -
第三章 Jiaja2模板引擎(二)
注:本片博客编写时,flask-bootstrap最新版本为:3.3.7.1,即针对BootStrap版本3.3.7的第一次发布。目前尚不支持BootStrap4。但bootstarp-flask扩展基于flask-bootstrap实现,旨在替代缺乏维护的后者。bootstrap简化了大部分功能,未内置模板,添加了bootstrap4支持,并增加了一些辅助功能。本文作为读书笔记分享,将介绍fla...原创 2019-08-12 17:16:43 · 365 阅读 · 0 评论 -
第三章 Jiaja2模板引擎(三)
一. 链接 任何具有多个路由的应用都可以链接不同的界面,例如导航栏。Flask提供了url_for辅助函数,使用路由的URL映射中保存的信息生成url。url_for()函数最简单的方法是以视图函数名(或者app.add_url_route()定义路由时使用的端点名)作为参数,返回对应的url:将Jiaja2模板引擎(二)中使用到的user.html模板中添加以下内容:...原创 2019-08-12 19:40:35 · 299 阅读 · 0 评论 -
第四章 WEB表单(一)
Flask请求对象包含包含客户端在请求中发送的全部信息,对包含表单数据的post请求来说,request.form可以轻松访问用户填写的信息。Flask-WTF扩展可以把处理WEB表单的过程(如:生成表单的HTML代码和验证表单提交的数据)变成一种愉悦的体验。Flask-WTF及其依赖可以通过pip安装:pip install flask-wtf一. 使用flask-wt...原创 2019-08-13 16:13:51 · 988 阅读 · 0 评论 -
第四章 WEB表单(二)
一. 重定向和用户会话 WEB表单(一)最后部分,当我们提交表单后,点击浏览器的刷新按钮时,看到一个警告“再次提交表单之前进行确认”。这是因为刷新浏览器时会重新发送之前发送过的请求,如果前一个请求是包含表单数据的post请求,刷新界面后会再次提交表单。 鉴于此,最好别让WEB浏览器把POST请求作为浏览器发送的最后一个请求。此处,我们可以使用重定向作为POST请...原创 2019-08-13 17:21:39 · 263 阅读 · 0 评论 -
第五章 Flask中操作数据库(一)
一. Python数据库框架 大多数数据库引擎都有对应的Python包,如:MySQL、SQLite、Redis、MongoDB等。此外还有一些数据库抽象层代码包供选择,如:SQLAlchemy和MongoEngine。选择数据库框架式,要考虑很多因素:易用性 抽象层也成为对象关系映射(ORM)或对象文档映射(ODM),可以把高层的面向对象操作转换为底层的数据库...原创 2019-08-14 13:18:05 · 533 阅读 · 0 评论 -
第五章 Flask中操作数据库(二)
学习是用模型的最好方法是在python shell中实际操作。shell使用flask shell启动,在这之前请先设定FLASK_APP环境变量。(提示:请按“Flask中操作数据库(一)”中的示例定义User和Role模型)一. 数据库操作1.1 创建表db.create_all()函数将寻找所有db.Model的子类,然后在数据库中创建对应的表:查看应用目录...原创 2019-08-14 16:06:21 · 411 阅读 · 0 评论 -
第五章 Flask中操作数据库(三)
一. 继承Python shell 前面的示例中,每次启动Flask shell都需要导入数据库实例和模型。通过注册一个shell上下文处理器,可以让flask shell命令自动导入这些对象:@app.shell_context_processordef make_shell_context(): return dict(db=db, User=User, Ro...原创 2019-08-14 17:28:01 · 544 阅读 · 0 评论 -
第六章 电子邮件(一)
很多应用都需要在特定事件发生时通知用户,最常用的通信方式就是就是电子邮件。原书的第六章介绍如何在Flask应用中发送电子邮件。(提示:本文使用的是QQ邮箱的SMTP服务器,所以在开始本篇的学习前,请先开通此功能,指导链接:https://jingyan.baidu.com/article/425e69e61e9178be15fc168a.html)一. 使用Flask-Ma...原创 2019-08-15 10:52:25 · 523 阅读 · 0 评论 -
第六章 电子邮件(二)
一. 在应用中集成电子邮件发送功能首先把应用发送电子邮件的部分抽象出来,作为单独的函数:app.py 电子邮件支持:# 添加发送电子邮件时应用层面的配置项app.config['FLASK_MAIL_SUBJECT_PREFIX'] = '[FLASK APP]'app.config['FLASK_MAIL_SENDER'] = 'Flask Admin <{}>'....原创 2019-08-15 12:47:26 · 660 阅读 · 0 评论 -
第七章 大型应用的结构(一)
尽管在单个脚本中编写小型WEB应用很方便,但伸缩性不好,应用变得复杂后,使用单个大型源码文件会导致很多问题。原书《Flask Web开发》在第7章使用包和模块组织大型应用。重构后的项目结构如下:四个顶级文件夹分别是:app:Flask应用包 migrations:数据库迁移仓库 tests:单元测试 venv:Python虚拟环境四个顶级文件:requir...原创 2019-08-16 15:56:31 · 317 阅读 · 0 评论 -
第七章 大型应用的结构(二)
一. 应用脚本(主脚本)应用脚本(主脚本)在顶级目录中的flasky.py模块中定义:import osfrom flask_migrate import Migratefrom app import create_app, dbfrom app.models import User, Roleapp = create_app(os.environ.get('FLASK_CON...原创 2019-08-19 10:13:52 · 234 阅读 · 0 评论 -
第八章 用户身份验证(一)
优秀的Python身份验证包很多,但没有一个能实现所有功能。此部分介绍的身份验证方案将使用多个包,并编写胶水代码,让不同的包良好协作。此部分使用的包如下:Flask-Login:管理已登录用户的用户会话; Werkzeug:计算密码散列值并进行核对; itsdangerous:生成并核对加密安全令牌;除了身份验证相关的包之外,此部分还将使用以下常规用途的扩展:Flask...原创 2019-08-23 13:40:40 · 900 阅读 · 0 评论 -
第八章 用户身份验证(二)
用户登录应用后,他们的验证状态要记录在用户会话中,这样浏览不同的页面时,才能记住这个状态。Flask-Login扩展用于管理用户身份验证系统中的验证状态,安装:pip install flask-login一. User用户模型适配Flask-LoginFlask-login的运转需要应用中有User对象,且必须实现如下的属性和方法:属性/方法 说明 ...原创 2019-08-27 09:06:45 · 491 阅读 · 0 评论 -
第八章 用户身份验证(三)
一. 添加登录表单登录表单包含:输入电子邮件地址的文本字段、密码字段、“记住我”复选框、提交按钮。app/auth/forms.py:登录表单如下:from flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, BooleanField, SubmitFieldfrom wtforms.va...原创 2019-08-27 11:34:38 · 1009 阅读 · 1 评论 -
第八章 用户身份验证(四)
一. 添加用户注册表单注册页面的表单要求用户输入电子邮件地址、用户名和2次密码,app/auth/forms.py: 用户注册表单class RegistrationForm(FlaskForm): """注册表单""" email = StringField('Email', validators=[DataRequired(), Length(1, 64), Ema...原创 2019-08-27 14:20:49 · 732 阅读 · 0 评论 -
第八章 用户身份验证(五)
一. 使用itsdangerous生成确认令牌账户确认过程中,往往会要求用户点击一个包含确认令牌的特殊URL链接。确认邮件中最简单的链接形如:http://www.example.com/auth/confirm/<id>,其中id是数据库分配给用户的数字id,用户点击链接后,处理这个路由的视图函数将确认收到的用户id,然后将用户状态更新为已确认。但这种方式显然很不安全,只要用...原创 2019-08-27 16:26:09 · 670 阅读 · 0 评论 -
第八章 用户身份验证(管理账户一)
修改密码:修改密码只需要用户处于登录状态,就可以放心显示一个表单,要求用户输入旧密码和替换的新密码。通过导航栏的 Change Password可以键入密码修改界面。1. templates/auth/change_password.html:修改密码模板{% extends "base.html" %}{% import "bootstrap/wtf.html" as wtf %}...原创 2019-08-27 16:44:57 · 452 阅读 · 0 评论 -
第八章 用户身份验证(管理账户二)
重设密码:为避免用户忘记密码后无法登录,应用可以提供重设密码的功能,为了安全起见,有必要使用令牌。用户请求重设密码后,应用向用户注册时提供的电子邮件地址发送一封包含重设令牌的电子邮件。用户点击电子邮件中的链接,令牌通过验证后,显示一个用于输入新密码的表单。1. 通过登录界面的链接进入重设密码界面: 2.模板和表单templates/auth/reset_passwor...原创 2019-08-27 17:50:25 · 676 阅读 · 0 评论 -
第八章 用户身份验证(管理账户三)
修改电子邮件地址:用户可以修改注册电子邮件的地址,不过接受新地址之前,必须使用确认邮件进行验证。为了验证新地址,应用发送一封包含令牌的邮件。服务器收到令牌后,再更新用户对象。服务器收到令牌之前,可以把新电子邮件地址保存在数据库一个新字段中,或者将其与id一起保存在令牌中。1)点击修改电子邮件,进入“Change Your Email Address”界面: 2)提交1)中的表单发...原创 2019-08-28 09:31:12 · 958 阅读 · 0 评论 -
第九章 用户角色(一)
一. 角色在数据库中的表示简单的应用,可能只需要2个用户角色,一个表示普通用户,一个表示管理员。对于这种情况在User模型中添加一个is_administrator布尔值即可。对于复杂的应用,可能需要在普通用户和管理员之间再细分出多个不同等级的角色,分别赋予用户一系列独立的权限。前面部分我们已经创建了一个roles表,并且users表和roles表构成了一对多的关系,如下是改进都的Role...原创 2019-09-04 09:01:13 · 802 阅读 · 0 评论 -
第九章 用户角色(二)
一. 赋予角色用户在应用中注册账户时,应该赋予其适当的角色。多数用户在注册时赋予的角色是“普通用户”,因为这是默认角色。唯一例外的是管理员,在注册应用时就应该被赋予管理员。当前应用中,管理员由保存在环境变量APP_ADMIN中的电子邮件地址识别,只要改电子邮件地址出现在注册请求中,就会被赋予admin。app/models.py:定义默认的用户角色class User(UserMix...原创 2019-09-04 11:13:26 · 388 阅读 · 0 评论 -
第十章 用户资料(一)
本部分内容为Flasky实现用户资料页面,显示用户在网站中的活动情况,并且这个URL要简短易记。一. 资料信息app/models.py:用户信息字段class User(UserMixin, db.Model): __tablename__ = "users" ... name = db.Column(db.String(64)) location ...原创 2019-09-08 12:42:14 · 509 阅读 · 0 评论 -
第十章 用户资料(二)
一. 用户级资料编辑器app/main/forms.py:资料编辑表单class EditProfileForm(FlaskForm): name = StringField('Real name', validators=[Length(0, 64)]) location = StringField('Location', validators=[Length(0, 6...原创 2019-09-08 14:44:26 · 397 阅读 · 0 评论 -
第十章 用户资料(三)
为了进一步改进资料页面的外观,可在用户界面中显示用户的头像。本应用中,我们使用Gravatar提供的用户头像。Gravatar是一个行业领先的头像服务,能把头像和电子邮件地址关联起来。用户要先到https://cn.gravatar.com/中注册账户,然后上传图像。此服务通过一个特殊的URL对外开放用户的头像,这个URL格式如下:https://secure.gravatar.com...原创 2019-09-08 17:48:57 · 418 阅读 · 0 评论 -
第十一章 博客文章(一)
一. 提交和显示博客文章app/models.py:博客文章的数据库模型:Post模型class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) body = db.Column(db.Text) timestamp = db.Colu...原创 2019-09-18 18:44:43 · 338 阅读 · 0 评论 -
第十一章 博客文章(二)
如果在首页和资料页面显示全部文章,页面加载速度会变慢,而且有点不切实际。在WEB浏览中,内容过多的网页需要花费更多的时间生成、下载和渲染。解决办法是:分页显示数据并分段渲染。一. 创建虚拟博客文章数据实现博客文章分页,需要大量的数据,手动添加费时费力。Python有多个包可以提供自动化解决方案,用于生成虚拟信息,其中比较完善的是Faker,这个包用pip安装:pip install ...原创 2019-09-20 14:20:48 · 216 阅读 · 0 评论 -
第十一章 博客文章(三)
一. Pagination类对象的属性及方法paginate()方法的返回值是一个Pagination类对象,这个类在Flask-SQLAlchemy中定义。这个类包含很多属性,用于在模板中生成分页链接,因此将其作为参数传入了模板。Flask-SQLAlchemy分页对象的属性 属性 说明 items 当前页的记录 query 分页的源查询(可打印此属性,查看原...原创 2019-09-20 15:33:30 · 271 阅读 · 0 评论 -
第十一章 博客文章(四)
本小节将对输入文章的多行文本输入框升级,让其支持MarkDown语法,并使用MarkDown和Flask-PageDown支持富文本文章,此处需要安装的几个新包如下:PageDown:使用JS实现的客户端MarkDown到HTML的转换程序; Flask-PageDown:Flask包装的PageDown,把PageDown集成到Flask-WTF表单中; MarkDown:使用Pytho...原创 2019-09-20 17:41:00 · 236 阅读 · 0 评论 -
第十一章 博客文章(五)
一. 博客文章的固定链接用户有时希望能在社交网站和用户分享某篇文章的链接,为此每篇文章都要有一个唯一的URL引用。此处我们使用插入数据库时使用的唯一URL构建博客文章的URL:app/main/views.py:文章的固定链接@main.route('/post/<int:id>')def post(id): post = Post.query.get_or_4...原创 2019-09-21 11:49:17 · 218 阅读 · 0 评论 -
第十二章 关注者(一)
社交WEB应用允许用户之间相互联系,在本章我们将学到如何在Flasky中实现关注功能,让用户“关注”其它用户,并在首页只显示所关注用户发布的博客文章列表。本节将再论数据库关系,讲解多对多关系以及自引用关系在ORM模型中表示。关系型数据库使用关系建立起记录之间的联系,其中“一对多”关系是最常用的关系模型,它把一个记录和一组相关的记录联系在一起。实现这种关系时,要在多这一侧加入一个外键,指向“一”...原创 2019-12-09 14:53:46 · 355 阅读 · 0 评论 -
第十二章 关注者(二)
在资料页面中显示关注者1.在用户资料界面添加关注信息(app/templates/user.html)...<p>Member since {{ moment(user.member_since).format('L') }}. Last seen {{ moment(user.last_seen).fromNow() }}.</p> <p&g...原创 2020-03-09 15:34:19 · 285 阅读 · 0 评论 -
第十二章 关注者(三)
应用项目首页目前按时间降序显示数据库中的所有文章,本节我们将在首页添加2个导航显示卡,分别显示所有文章以及所关注用户的文章。(在User类的初始化方法中,将用户关注自身,在Follower中也可以看到用户自己发表的文章)。一. 使用数据库联结查询所关注用户的所有文章 显示所关注用户发布的所有文章,第一步显然是要获取这些用户,然后获取各用户的文章,再按一定顺序排...原创 2020-03-09 19:59:57 · 234 阅读 · 0 评论 -
第十三章 用户评论(一)
本节实现用户评论功能一. 评论在数据库中的表示评论包含正文、作者和时间戳;用户和评论,文章和评论均为一对多的关系,我们需要在多这一次侧定义外键:class Comment(db.Model): __tablename__ = 'comments' id = db.Column(db.Integer, primary_key=True) body = db....原创 2020-03-10 10:28:31 · 713 阅读 · 0 评论 -
第十三章 用户评论(二)
本节的内容非常轻松,管理评论;具有Moderate权限的用户,可以控制评论的显示和隐藏;app/template/base.html 在导航栏中加入管理评论链接:...<ul class="nav navbar-nav navbar-right"> {% if current_user.can(Permission.MODERATE) %} &l...原创 2020-03-10 11:40:53 · 310 阅读 · 0 评论 -
第十四章 应用编程接口(一)
近些年,随着WEB应用中,业务逻辑被越来越多地移到客户端,服务器的主要功能(有时是唯一功能)是为客户端提供数据存取服务。在这种模式中,服务器变成了Web服务或应用编程接口(API)。在编写API时,表现层状态转移(REST)架构崭露头角。Flask是开发REST架构的理想框架,因为Flask天生轻量。本章我们将学习如何使用Flask实现符合REST架构的API。一. REST简...原创 2020-03-10 15:29:38 · 193 阅读 · 0 评论