04 2019 档案
摘要:在实际需求中,我们往往需要不同的配置组合。例如,开发用的配置,测试用的配置,生产环境用的配置。为了能方便地在这些配置中切换,你可以把配置文件升级为包,然后为这些使用场景分别创建不同的配置文件,但是最方便的做法是在单个配置文件中使用python类来组织多个不同类别的配置。 下面的代码是personal
阅读全文
摘要:实例化flask提供的blueprint类就创建一个蓝本实例。像程序实例一样,我们可以为蓝本实例注册路由、错误处理函数、上下文处理函数,请求处理函数,甚至是单独的静态文件文件夹和模板文件夹。在使用上,它和程序实例也很相似。比如,蓝本实例同样拥有一个route()装饰器,可以用来注册路由,但实际上蓝本
阅读全文
摘要:个人博客 博客是典型的CMS(Content Management system,内容管理系统),通常由两部分组成:一部分是博客前台,用来展示开放给所有用户的博客内容;另一部分是博客后台,这部分内容仅开放给博客管理员,用来对博客资源进行添加、修改和删除等操作。 在这个项目,我们会学习更高级的项目组织
阅读全文
摘要:使用Flask-DebugToolbar调试程序 扩展Flask-DebugToolbar提供了一系列调试功能,可以用来查看请求的SQL语句、配置选项、资源加载情况等信息。这些信息在开发时会非常有用。首先使用pipenv安装Flask-DebugToolbar及其依赖: 然后实例化扩展提供的Debu
阅读全文
摘要:使用Faker生成虚拟数据 创建虚拟数据是编写Web程序时的常见需求。在简单的场景下,我们可以手动创建一些虚拟数据,但更方便的选择是使用第三方库实现。流行的python虚拟数据生成工具有Mimesis和Faker,后者同时支持python2和python3,而且文档中包含丰富的示例,所以这里选用Fa
阅读全文
摘要:使用Bootstrap-Flask简化页面编写 扩展Bootstrap-Flask内置了可以快速渲染Bootstrap样式HTML组件的宏,并提供了内置的Bootstap资源,方便快速开发,使用它可以简化在web程序里使用Bootstrap的过程。 扩展Bootstrap-Flask基于Flask-
阅读全文
摘要:Web程序开发流程 在实际的开发中,一个Web程序的开发过程要设计多个角色,比如客户(提出需求)、项目经理(决定需求的实现方式)、开发者(实现需求)等,在这里我们假设自己是一个人全职开发。一般来说一个web程序的开发流程如下所示: 1) 分析需求,列出功能清单或写需求说明书 2) 设计程序功能,写功
阅读全文
摘要:Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入messageboard目录使用pipenv创建虚拟环境,这会同时安装所有依赖(--dev选项用来包括
阅读全文
摘要:异步发送邮件 当使用SMTP的方式发送电子邮件时,如果你手动使用浏览器测试程序的注册功能,在提交注册表单后,浏览器会有几秒钟的不响应。因为这时候程序正在发送电子邮件,发信的操作阻断了请求--响应循环,直到发信的send_mail()函数调用结束后,视图函数才会返回响应。这几秒的延迟带了不好的用户体验
阅读全文
摘要:电子邮件进阶实践 下面来学习构建邮件的HTML正文,并使用模板组织内容。 一封电子邮件的正文可以是纯文本(text/plain),也可以是HTML格式的文本(text/html)。处于全面的考虑,一封邮件应该既包含纯文本正文又包含HTML格式的正文。HTML格式的正文将被优先读取;加入收信人的邮件系
阅读全文
摘要:电子邮件 在web程序中,经常会需要发送电子邮件。比如,在用户注册账户时发送确认邮件;定期向用户发送热门内容或是促销信息等等。在Web程序中发送电子邮件并不复杂,借助扩展Flask-Mail或是第三方邮件服务,只需要几行代码就可以发送邮件。 下面例子中,我们使用一封示例邮件,邮件仅包含几个必要的字段
阅读全文
摘要:在flask中,我们可以使用Flask提供的过个装饰器注册请求回调函数,他们会在特定的请求处理环节被执行。类似的,SQLAlchemy也提供了一个listen_for()装饰器,他可以用来注册时间回调函数。 listen_for()装饰器主要接收两个参数,target表示监听的对象,这个对象可以是模
阅读全文
摘要:数据库进阶实践 Cascade意为“级联操作”,就是在操作一个对象的同时,对相关的对象也执行某些操作。我们通过一个Post模型和Comment模型来演示级联操作,分别表示文章(帖子)和评论,两者是一对多关系: 级联行为通过关系函数relationship()的cascade参数设置。我们希望在操作P
阅读全文
摘要:最近在练习用flask_mail发送163邮件时报错: reply: '553 authentication is required,163 smtp9,DcCowAD3eEQZ561caRiaBA--.47S2 1554900770\r\n'reply: retcode (553); Msg: a
阅读全文
摘要:在开发时,以删除表再重建的方式更新数据库简单直接,但明显的缺陷是会丢掉数据库中的所有数据。在生产环境下,没有人想把数据都删除掉,这时需要使用数据库迁移工具来完成这个工作。SQLAlchemy的开发者Michael Bayer写了一个数据库迁移工作—Alembic来帮助我们实现数据库的迁移,数据库迁移
阅读全文
摘要:flask 操作数据时,db的要在app.config设置之后声明:如app.config['SQLALCHEMY_DATABASE_URI'] 否则,运行程序时app.config里面做的设置就不会生效,就会提示各种参数没做设置 因为db在声明的时候解释器就会去读数据库URI的值,如果此时没有读到
阅读全文
摘要:更新书库库表 模型类(表)不是一成不变的,当你添加了新的模型类,或是在模型类中添加了新的字段,甚至是修改了字段的名称或类型,都需要更新表。在前面我们把数据库表比成盛放货物的货架,这些货架是固定生成的。当我们在操控程序(DBMS/ORM)变更了货架的结构时,仓库的货架也要根据变化相应进行调整。而且,当
阅读全文
摘要:我们使用学生和老师来演示多对多关系:每个学生有多个老师,每个老师有多个学生。多对多关系示意图如下: 在实例程序中,Student类表示学生,Teacher类表示老师。在这两个模型之间建立多对多关系后,我们需要在Student类中添加一个集合关系属性teachers,调用它可以获取某个学生的多个老师,
阅读全文