Flask请求对象包含客户端发出的所有请求信息.其中,request.form 能获取POST 请求中提交的表单数据.尽管Flask 的请求对象提供的信息足够用于处理Web 表单,但有些任务很单调,而且要重复操作.比如,生成表单的HTML 代码和验证提交的表单数据.Flask-WTF(http://pythonhosted.org/Flask-WTF/)扩展可以把处理Web 表单的过程变成一种愉悦的体验.这个扩展对独立的WTForms(http://wtforms.simplecodes.com…
表单字段是可调用的,在模板中调用后会渲染成HTML.假设视图函数把一个NameForm 实例通过参数form 传入模板,在模板中可以生成一个简单的表单,如下所示: <form method="POST"> {{ form.hidden_tag() }} {{ form.name.label }} {{ form.name() }} {{ form.submit() }} </form> 当然,这个表单还很简陋.要想改进表单的外观,可以把参数传入渲染字段的函数,传…
初始化 所有Flask程序都必须创建一个程序实例,Web服务器使用一种名为Web服务器网关接口的的协议(WSGI),把接收自客户端的所有请求转发给这个对象处理.程序实例是Flask类的对象,使用下面代码构建 from flask import Flask app = FLask(__name__) Flask类的构造函数只有一个必须指定的参数,即程序主模块或则包的名称..在大多数程序中,Python 的__name__ 变量就是所需的值.将构造函数的name 参数传给Flask 程序,这一点可能…
使用虚拟环境 安装Flask最简单的方式是使用虚拟环境,虚拟环境是python解释器的一个私有副本,在这个环境中你可以安装私有包,而且不会影响系统中安装的全局的Python解释器.虚拟环境非常有用,可以在系统的Python 解释器中避免包的混乱和版本的冲突.为每个程序单独创建虚拟环境可以保证程序只能访问虚拟环境中的包,从而保持全局解释器的干净整洁,使其只作为创建(更多)虚拟环境的源.使用虚拟环境还有个好处,那就是不需要管理员权限. 虚拟环境使用第三方实用工具virtualenv 创建.输入以下命…
Flask被设计成可扩展形式,因此并没有提供一些重要的功能,比如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发.社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你还可使用所有Python 标准包或代码库.为了让你知道如何把扩展整合到程序中,接下来我们将在hello.py 中添加一个扩展,使用命令行参数增强程序的功能. 使用Flask-Script支持命令行选项 Flask 的开发Web 服务器支持很多启动设置选项,但只能在脚本中作为参数传给app.run()函…
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能 创建语句格式: startTime = DateTimeField('计划开始时间', validators=[DataRequired('不可为空'),EqualTo('nowTime',message='两次事件必须一致')],format='%Y/%m/%d %H:%M:%S' render_kw={'placeholder':'2018-06-03 00:00:00…
Bootstrap入门(五)表单   先引入本地的CSS文件  <link href="css/bootstrap.min.css" rel="stylesheet"> 一.内联表单 单独的表单控件会被自动赋予一些全局样式.所有设置了 .form-control 类的 <input>.<textarea> 和 <select> 元素都将被默认设置宽度属性为 width: 100%;. 而内联表单,要为 <form…
在新版hello.py 中,视图函数index() 不仅要渲染表单,还要接收表单中的数据.更新后的index() 视图函数如下: @app.route('/') def index(): name = None form = NameForm() if form.validate_on_submit(): name = form.name.data form.name.data = '' return render_template('index.html',form=form,name=nam…
在视图函数中验证表单 因为现在的basic_form视图同时接受两种类型的请求:GET请求和POST请求.所以我们要根据请求方法的不同执行不同的代码.具体来说,首先是实例化表单,如果是GET请求,就渲染模板:如果是POST请求,就调用validate()方法验证表单数据. 请求的HTTP方法可以通过requeset.method属性获取,我们可以使用下面的方式来组织视图函数: from flask import request @app.route('/basic', methods=['GET…
请求完成后,有时需要让用户知道状态发生了变化.这里可以使用确认消息.警告或者错误提醒.一个典型例子是,用户提交了有一项错误的登录表单后,服务器发回的响应重新渲染了登录表单,并在表单上面显示一个消息,提示用户用户名或密码错误. 这种功能是Flask 的核心特性.如下面例子所示,flash() 函数可实现这种效果. from flask import Flask, render_template, session, redirect, url_for, flash @app.route('/', m…
最新版的hello.py 存在一个可用性问题.用户输入名字后提交表单,然后点击浏览器的刷新按钮,会看到一个莫名其妙的警告,要求在再次提交表单之前进行确认.之所以出现这种情况,是因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求.如果这个请求是一个包含表单数据的POST 请求,刷新页面后会再次提交表单.大多数情况下,这并不是理想的处理方式. 很多用户都不理解浏览器发出的这个警告.基于这个原因,最好别让Web 程序把POST 请求作为浏览器发送的最后一个请求. 这种需求的实现方式是,使用重定…
默认情况下,Flask-WTF 能保护所有表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击.恶意网站把请求发送到被攻击者已登录的其他网站时就会引发CSRF 攻击. 为了实现CSRF 保护,Flask-WTF 需要程序设置一个密钥.Flask-WTF 使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪.设置密钥的方法如下所示: app = Flask(__name__) app.config['SECRET_KEY'] = 'hard to gu…
我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包含变量的模板引擎实例如下: <h1>Hello, {{ name }}!</h1> 渲染模板 默认情况下,Flask 在程序文件夹中的templates 子文件夹中寻找模板.在下一个hello.py版本中,要把前面定义的模板保存在templates 文件夹中,并分别命名为index.h…
一个AngularJS表单是一组输入型控件的集合. HTML控件 HTML输入型标签标包括: input标签 select标签 button标签 textarea标签 HTML表单 HTML表单将各种HTML控件组合到一起. 一个AngularJS表单的例子 First Name: Last Name: RESET form = {{user}} master = {{master}} // 程序代码 <div ng-app="myApp" ng-controller="…
字符串拼接 计算机语言 都是 对  数据的处理(获取/修改数据)  添加元素  除了  固定的方法添加 以外 都是   字符串拼接(拼接成固定格式即可执行). 1.表单添加元素  append() 方法 <select id="sel"> </select> <input type="text" id="shuru" /> <input type="button" value=&quo…
树表类型表单 表单创建,基础配置如下: 1.设置表单类型为:单表; 2.是否树选择:是; 3.设置特殊字段:[树形表单父id][树开表单列] 结果测试…
表单验证: 在数据被送到服务器之前对HTML表单中的输入数据进行验证,避免服务器频繁验证信息造成用户体验差. (1)表单数据是否为空 (2)输入的信息格式是否正确 (3)输入数据的类型是否正确 必填(必选)项目验证: 判断输入是否为空. function validateForm() { var x=document.forms["myForm"]["fname"].value; if (x==null || x=="") { alert(&qu…
学习内容 Ø        表格的作用和制作 Ø        表单的制作 能力目标 Ø        掌握表格的创建 Ø        掌握设置表格的常用属性: Ø        理解表单的作用 Ø        熟练掌握表单常用元素 本章简介 表格对于网页制作而言极其重要,其最明显的优点是能够以行列整齐的形式来显示文本.数字.图片信息.而且,表格还可以用于固定文本或图像的显示位置.经常上网的用户会发现表格被大量网站广泛应用,例如新闻列表.商品显示等. 除此之外,网站中经常有很多页面的信息需要…
前面 前面我们已经熟悉了网页上一些常见的元素,如在网页上显示一段文字.一张图片.一个列表.一张表格等等.这些东西都是事先编辑好显示在页面上只提供给用户看的,实际上,我们可以把这样的页面称之为静态页面.有“静”就有”动”,自然也就有了动态页面,所谓动态页面就是在页面上能提供与用户产生交互的元素,比如:我们想注册成为某个网站的会员,就要填写注册信息提交给网站后台:我们在网上发表评论:我们在网上填写一些调查问卷等等. 上图的163邮箱注册页面就是一个表单,在表单中有文本框.下拉列表.按钮等元素,我们可…
表单数据的校验对于提高WEB安全性意义不大,因为服务器接收到的请求不一定来自我们的前端页面,有可能来自别的站点,黑客可以自己做一个表单,把数据提交到我们的服务器(即跨站伪造请求),这样就绕过了前端页面的校验.如果对HTTP协议比较熟,甚至还可以在程序中手动构造一段HTTP请求发到服务器,所以服务器端的数据校验绝对是必不可少的. WEB前端数据校验的意义在于改善用户体验,用户不用等到將数据提交到服务器后才知道哪些数据是不合法的. 使用AngularJs对表单元素进行校验是相当方便的,我们来看一下可…
一.列表 1.作用:默认显示方式为从上到下的显示数据 2.列表的组成 列表类型和列表项 3.列表的分类:有序列表   无序列表   自定义列表 无序列表语法为ul>li, 语法:ul代表列表,li代表列表项 有序列表语法为ol>li, 语法:ol代表列表,li代表列表项 自定义列表,用法: <dl> <dt>1</dt> <dd>1</dd> </dl> 语法: dl列表的类型 dt列表的标题 dd 列表项 二.表单 1.…
一.程序包 程序包用来保存程序的所有代码.模板和静态文件.我们可以把这个包直接称为app(应用),如果有需求,也可使用一个程序专用名字.templates 和static 文件夹是程序包的一部分,因此这两个文件夹被移到了app 中.数据库模型和电子邮件支持函数也被移到了这个包中,分别保存为app/models.py 和app/email.py. 使用程序工厂函数 在单个文件中开发程序很方便,但却有个很大的缺点,因为程序在全局作用域中创建,所以无法动态修改配置.运行脚本时,程序实例已经创建,再修改…
尽管在单一脚本中编写小型Web 程序很方便,但这种方法并不能广泛使用.程序变复杂后,使用单个大型源码文件会导致很多问题.不同于大多数其他的Web 框架,Flask 并不强制要求大型项目使用特定的组织方式,程序结构的组织方式完全由开发者决定.在本节,我们将介绍一种使用包和模块组织大型程序的方式. 一.项目结构 Flask 程序的基本结构如下所示: |-blogs |-app/ |-templates/ |-static/ |-main/ |-__init__.py |-errors.py |-fo…
在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库.仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建.因此,更新表的唯一方式就是先删除旧表,不过这样做会丢失数据库中的所有数据.更新表的更好方法是使用数据库迁移框架.源码版本控制工具可以跟踪源码文件的变化,类似地,数据库迁移框架能跟踪数据库模式的变化,然后增量式的把变化应用到数据库中. SQLAlchemy 的主力开发人员编写了一个迁移框架,称为Alembic(https://alembic…
Bootstrap(http://getbootstrap.com/)是Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代Web 浏览器. 要想在程序中集成Bootstrap,显然要对模板做所有必要的改动.不过,更简单的方法是使用一个名为Flask-Bootstrap 的Flask 扩展,简化集成的过程.Flask-Bootstrap 使用pip安装: pip install flask_bootstrap Flask 扩展一般…
Flask-SQLAlchemy 是一个Flask 扩展,简化了在Flask 程序中使用SQLAlchemy 的操作.SQLAlchemy 是一个很强大的关系型数据库框架,支持多种数据库后台.SQLAlchemy 提供了高层ORM,也提供了使用数据库原生SQL 的低层功能. 和其他大多数扩展一样,Flask-SQLAlchemy 也使用pip 安装: pip install flask-sqlalchemy 在Flask-SQLAlchemy 中,数据库使用URL 指定.最流行的数据库引擎采用的…
Moment.js 是一个简单易用的轻量级JavaScript日期处理类库,提供了日期格式化.日期解析等功能.它支持在浏览器和NodeJS两种环境中运行.此类库能够 将给定的任意日期转换成多种不同的格式,具有强大的日期计算功能,同时也内置了能显示多样的日期形式的函数.Flask-Moment是一个集成moment.js到Jinja2模板的Flask扩展.安装Flask-Moment的方式如下: pip install Flask-Moment 初始化Flask-Moment from flask…
Web 程序不是仅由Python 代码和模板组成.大多数程序还会使用静态文件,例如HTML代码中引用的图片.JavaScript 源码文件和CSS. 在前面的章节中,我们曾检查hello.py 程序的URL 映射时,其中有一个static 路由.这是因为对静态文件的引用被当成一个特殊的路由,即/static/<filename>.例如,调用url_for('static', filename='css/styles.css', _external=True) 得到的结果是http://loc…
在Web开发中,任何具有多个路由的程序都需要可以连接不同页面的链接,例如导航条. 在模板中直接编写简单路由的URL 链接不难,但对于包含可变部分的动态路由,在模板中构建正确的URL 就很困难.而且,直接编写URL 会对代码中定义的路由产生不必要的依赖关系.如果重新定义路由,模板中的链接可能会失效. 为了避免这些问题,Flask 提供了url_for() 辅助函数,它可以使用程序URL 映射中保存的信息生成URL. url_for() 函数最简单的用法是以视图函数名(或者app.add_url_r…
如果你在浏览器的地址栏中输入了不可用的路由,那么会显示一个状态码为404 的错误页面.现在这个错误页面太简陋.平庸,而且样式和使用了Bootstrap 的页面不一致. 像常规路由一样,Flask 允许程序使用基于模板的自定义错误页面.最常见的错误代码有两个:404,客户端请求未知页面或路由时显示:500,有未处理的异常时显示.为这两个错误代码指定自定义处理程序的方式如下: @app.errorhandler() def page_not_found(e): @app.errorhandler()…