03 2019 档案
摘要:我们将使用国家和首都来演示一对一关系:每个国家只有一个首都。反过来,一个城市也只能作为一个国家的首都。一对一关系如下: 在示例程序中,Country类表示国家,Capital类表示首都。建立一对一关系后,我们将在Country类中创建一个标量关系capital,调用它会获取单个Capital对象,我
阅读全文
摘要:一对多关系反过来就是多对一关系,这两种关系模式分别从不同的视角出发。一个作者拥有多篇文章,反过来就是多篇文章属于同一个作者。为了便于区分,我们使用居民和城市来演示多对一关系:多个居民住在同一个城市。多对一关系如下: 在例子中,Citizen类表示居民,City类表示城市。建立多对一关系后,我们将在C
阅读全文
摘要:定义关系 在关系型数据库中,我们可以通过关系让不同表之间的字段建立联系。一般来说,定义关系需要两步,分别是创建外键和定义关系属性。在更复杂的多对多关系中,我们还需要定义关联表来管理关系。下面我们学习用SQLAlchemy在模型之间建立几种基础的关系模式。 在上面的操作中,每一次使用flask she
阅读全文
摘要:在视图函数里操作数据库 在视图函数里操作数据的方式和在python shell中的联系基本相同,只不过需要一些额外的工作。比如把查询结果作为参数 传入模板渲染出来,或是获取表单的字段值作为提交到数据库的数据。接下来,我们将把前面学习的所有数据库操作知识运用到一个简单的笔记程序中。这个程序可以用来创建
阅读全文
摘要:数据库操作 现在我们创建了模型,生成了数据库和表,下面来学习常用的数据库操作,数据库操作主要是CRUD,即Create(创建)、Read(读取/查询)、Update(更新)和Delete(删除)。 SQLAlchemy使用数据库会话来管理数据库操作,这里的数据库会话也称为事务(transaction
阅读全文
摘要:使用Flask-SQLAlchemy管理数据库 扩展Flask-SQLAlchemy集成了SQLAlchemy,它简化了连接数据库服务器、管理数据库操作会话等各种工作,让Flask中的数据处理体验变得更轻松。首先使用pipenv安装Flask-SQLAlchemy以及其依赖(主要是SQLAlchem
阅读全文
摘要:数据库 数据库是大多数动态web程序的基础设施,只要你想把数据存下来,就离不开数据库。 这里所说的数据库指的是有存储数据的单个或多个文件组成的集合,它是一种容器,可以类比文文件柜。而人们通常使用数据库来表示操作数据库的软件,这类管理数据库的软件被称为数据库管理系统,常见的数据库管理系统(DBMS)有
阅读全文
摘要:渲染模板时,访问页面提示TypeError: 'UnboundField' object is not callable 检查代码,发现实例化表单类是,没有加括号:form = NewNoteForm,加了括号后就解决了form = NewNoteForm()
阅读全文
摘要:flask用宏渲染表单模板时,表单提交后,提交的内容符合DataRequired()校验, 但是form.validate_on_submit()返回的是False, 原因可能是表单模板中的<form>中没有指明请求的方法'get'或'post' flask_wtf类的validate_on_sub
阅读全文
摘要:单个页面多个表单 除了在单个表单上实现多个提交按钮,有时还需要在单个页面上创建多个表单。比如,在程序的主页上同时添加登录和注册表单。当在同一个页面上添加多个表单时,我们需要解决的问题是在视图函数中判断当前被提交的是哪个表单。 创建两个表单,并在模板中分别渲染比较容易,但当提交某个表单是,就会遇到问题
阅读全文
摘要:单个表单多个提交按钮 在某些情况下,可能需要为一个表单添加多个提交按钮。比如在创建文章的表单中添加发布按钮和存草稿的按钮。当用户提交表单时,需要在视图函数中根据按下的按钮来做出不同的处理。 下面例子中创建了一个表单,save按钮用于保存,publish表示发布,正文字段使用TextAreaField
阅读全文
摘要:使用Flask-CKEditor集成富文本编辑框 富文本编辑器即所见即所得编辑器,类似于文本编辑软件。它提供一系列按钮和下拉列表来为文本设置格式,编辑状态的文本样式即最终呈现出来的样式。在Web程序中,这种编辑器也称为HTML富文本编辑器,因为它使用HTML标签来为文本定义样式。 CKEditor是
阅读全文
摘要:文件上传 在HTML中,渲染一个文件上传字段只需要将<input>标签的type属性设为file,即<input type=”file”>。 这会在浏览器中渲染成一个文件上传字段,单击文件选择按钮会打开文件选择窗口,选择对应的文件后,被选择的文件名会显示在文件选择按钮旁边。 在服务器端,可以和普通数
阅读全文
摘要:自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器。 除了使用WTForms提供的验证器来验证表单字段,我们还可以在表单类中定义方法来验证特定字段,例如: form/form.py: 针对特定字段的验证器 当表单类中包含以
阅读全文
摘要:在模板中渲染表单时,有大量的工作: 1、调用字段属性,获取<input>定义 2、调用对应的label属性,获取<label>定义 3、渲染错误消息 为了避免为每一个字段重复这些代码,我们可以创建一个宏来渲染表单字段 macro.html: 这个form_field()宏接收表单类实例的字段属性和附
阅读全文
摘要:在模板中渲染错误消息 InputRequired验证器和DataRequired很相似,但InputRequired仅验证用户是否有输入,而不管输入的值是否有效。例如,有空格组成的数据也会通过验证。当是DataRequired时,如果用户输入的数据不符合字段要求,比如在IntegerField输入非
阅读全文
摘要:在视图函数中验证表单 因为现在的basic_form视图同时接受两种类型的请求:GET请求和POST请求。所以我们要根据请求方法的不同执行不同的代码。具体来说,首先是实例化表单,如果是GET请求,就渲染模板;如果是POST请求,就调用validate()方法验证表单数据。 请求的HTTP方法可以通过
阅读全文
摘要:处理表单数据 表单数据的处理涉及很多内容,从获取数据到保存数据大致有以下步骤: 1、 解析请求,获取表单数据 2、 对数据进行必要的转换,比如讲勾选框的值转换成python的布尔值 3、 验证数据是否符合要求,同时验证CSRF令牌。 4、 如果验证未通过则需要生成错误消息,并在模板中显示错误消息。
阅读全文
摘要:在模板中渲染表单 为了能够在模板中渲染表单,我们需要把表单类实例传入模板。首先在视图函数里实例化表单类LoginForm,然后再render_template()函数中使用关键脑子参数form将表单实例传入模板,例如:form/app.py 在模板中,需要调用表单类的属性即可获取字段对应的HTML代
阅读全文
摘要:使用Flask-WTF处理表单 扩展Flask-WTF继承了WTFforms,使用它可以在flask中更方便的使用WTForms。Flask-WTF将表单数据解析、CSRF保护、文件上传等功能与Flask集成。 激活pipenv环境 看下环境中安装了什么 pipenv install flask-w
阅读全文
摘要:表单 在Web程序中,表单时和用户交互最常见的方式之一。用户注册、登录、撰写文章、编辑设置,无一不用到表单。不过,表单的处理不简单。要创建表单,验证用户输入的内容,向用户显示错误提示,还要获取并保存数据。 WTForms可以做这些事情,WTForms是一个使用python编写的表单库,它使得表单的定
阅读全文
摘要:当程序逐渐变大时,很多时候我们需要在javaScript和CSS代码中使用jinja2提供的变量值,甚至是控制语句。比如,通过传入模板的theme_color变量来为页面设置主题色彩,或是根据用户是否登陆来决定是否执行某个javaScript函数。 需要注意,只有使用render_template(
阅读全文
摘要:自定义错误页面 当程序返回错误响应时,会渲染一个默认的错误页面,我们可以注册错误处理函数来处理错误页面 错误处理函数和视图函数很相似,返回值将作为响应的主题,因此我们先要创建错误页面的模板文件。为了和普通模板区分开,我们在模板文件夹templates里建一个errors子文件夹,在其中为最常见的40
阅读全文
摘要:消息闪现 flask提供了一个非常有用的flash()函数,它可以用来“闪现”需要提示给用户的消息,比如当用户登录成功后显示“欢迎回来!”。在视图函数调用flash()函数,传入消息内容,flash()函数把消息存储在session中,我们需要在模板中使用全局函数get_flashed_messag
阅读全文
摘要:加载静态文件 一个Web项目不仅需要HTML模板,还需要许多静态文件,比如CSS、JavaScript文件、图片和声音声。在flask程序中,默认需要将静态文件存储在与主脚本(包含程序实例的脚本)同级目录的static文件夹中。 为了在HTML文件中引用静态文件,我们需要使用url_for()函数获
阅读全文
摘要:模板应用实践 空白控制 在实际输出的HTML文件中,模板中的jinja2语句、表达式和注释会保留移除后的空行。 例如下面的代码: jinja2语句中的代码缩进并不是必须的,添加缩进可以增加可读性。 如果想再渲染时自动去掉空行,可以在定界符内侧添加减号。比如{%-endfor%}会移除该语句前的空白,
阅读全文