## Web 表单 配置

    为了能够处理 web 表单,我们将使用 Flask-WTF ,该扩展封装了 WTForms 并且恰当地集成进 Flask 中。

    许多 Flask 扩展需要大量的配置,因此我们将要在 microblog 文件夹的根目录下创建一个配置文件以至于容易被编辑。这就是我们将要开始的(文件 config.py):

    $ config.py
> CSRF_ENABLED = True
> SECRET_KEY = 'you-will-never-guess' // 告诉 Flask 去读取配置文件 app/__init__.py > from flask import Flask
>
> app = Flask(__name__)
> app.config.from_object('config')
>
> from app import views ## 用户登录表单 在 Flask-WTF 中,表单是表示成对象,Form 类的子类。一个表单子类简单地把表单的域定义成类的变量。 我们将要创建一个登录表单,用户用于认证系统。在我们应用程序中支持的登录机制不是标准的用户名/密码类型,我们将使用 OpenID。OpenIDs 的好处就是认证是由 OpenID 的提供者完成的,因此我们不需要验证密码,这会让我们的网站对用户而言更加安全。 OpenID 登录仅仅需要一个字符串,被称为 OpenID。我们将在表单上提供一个 ‘remember me’ 的选择框,以至于用户可以选择在他们的网页浏览器上种植 cookie ,当他们再次访问的时候,浏览器能够记住他们的登录。 $ vim app/forms.py
> from flask.ext.wtf import Form
> from wtforms import StringField, BooleanField
> from wtforms.validators import DataRequired
>
> class LoginForm(Form):
> openid = StringField('openid', validators=[DataRequired()])
> remember_me = BooleanField('remember_me', default=False) ## 表单模板 $ vim app/templates/login.html
> <!-- extend from base layout -->
> {% extends "base.html" %}
>
> {% block content %}
> <h1>Sign In</h1>
> <form action="" method="post" name="login">
> {{form.hidden_tag()}}
> <p>
> Please enter your OpenID:<br>
> {{form.openid(size=)}}<br>
> </p>
> <p>{{form.remember_me}} Remember Me</p>
> <p><input type="submit" value="Sign In"></p>
> </form>
> {% endblock %} ## 表单视图 $ vim app/views.py > from flask import render_template, flash, redirect
> from app import app
> from .forms import LoginForm
>
> # index view function suppressed for brevity
>
> @app.route('/login', methods = ['GET', 'POST'])
> def login():
> form = LoginForm()
> return render_template('login.html',
> title = 'Sign In',
> form = form) ## 接收表单数据 // 验证表达数据是否正确(form.validate_on_submit),调用flash()显示消息
$ vim app/views.py
> @app.route('/login', methods = ['GET', 'POST'])
> def login():
> form = LoginForm()
> if form.validate_on_submit():
> flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data))
> return redirect('/index')
> return render_template('login.html',
> title = 'Sign In',
> form = form) // flash显示消息
$ vim app/templates/base.html
<html>
<head>
{% if title %}
<title>{{title}} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<div>Microblog: <a href="/index">Home</a></div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }} </li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html> ## 加强字段验证 $ vim app/templates/login.html
> <!-- extend base layout -->
> {% extends "base.html" %}
>
> {% block content %}
> <h1>Sign In</h1>
> <form action="" method="post" name="login">
> {{ form.hidden_tag() }}
> <p>
> Please enter your OpenID:<br>
> {{ form.openid(size=) }}<br>
> {% for error in form.openid.errors %}
> <span style="color: red;">[{{ error }}]</span>
> {% endfor %}<br>
> </p>
> <p>{{ form.remember_me }} Remember Me</p>
> <p><input type="submit" value="Sign In"></p>
> </form>
> {% endblock %} ## 处理 OpenIDs $ vim config.py
> OPENID_PROVIDERS = [
> { 'name': 'Google', 'url': 'https://www.google.com/accounts/o8/id' },
> { 'name': 'Yahoo', 'url': 'https://me.yahoo.com' },
> { 'name': 'AOL', 'url': 'http://openid.aol.com/<username>' },
> { 'name': 'Flickr', 'url': 'http://www.flickr.com/<username>' },
> { 'name': 'MyOpenID', 'url': 'https://www.myopenid.com' }] $ vim app/view.py
> return render_template('login.html',
> title = 'Sign In',
> form = form,
> providers = app.config['OPENID_PROVIDERS']) $ vim app/templates/login.html)
> <!-- extend base layout -->
> {% extends "base.html" %}
>
> {% block content %}
> <script type="text/javascript">
> function set_openid(openid, pr)
> {
> u = openid.search('<username>')
> if (u != -) {
> // openid requires username
> user = prompt('Enter your ' + pr + ' username:')
> openid = openid.substr(, u) + user
> }
> form = document.forms['login'];
> form.elements['openid'].value = openid
> }
> </script>
> <h1>Sign In</h1>
> <form action="" method="post" name="login">
> {{ form.hidden_tag() }}
> <p>
> Please enter your OpenID, or select one of the providers below:<br>
> {{ form.openid(size=) }}
> {% for error in form.openid.errors %}
> <span style="color: red;">[{{error}}]</span>
> {% endfor %}<br>
> |{% for pr in providers %}
> <a href="javascript:set_openid('{{ pr.url }}', '{{ pr.name }}');">{{ pr.name }}</a> |
> {% endfor %}
> </p>
> <p>{{ form.remember_me }} Remember Me</p>
> <p><input type="submit" value="Sign In"></p>
> </form>
> {% endblock %}

Flask03-Form的更多相关文章

  1. form表单验证-Javascript

    Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...

  2. Form 表单提交参数

    今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...

  3. s:form标签

    2017-01-07 17:43:18 基本的用法 <!-- Action类必须有一个无参的构造器,因为在执行action方法之前,拦截器已经创建了一个"空"的Action对 ...

  4. ASP.NET Aries JSAPI 文档说明:AR.Form、AR.Combobox

    AR.Form 文档 1:对象或属性: 名称 类型 说明 data 属性 编辑页根据主键请求回来的数据 method 属性 用于获取数据的函数指向,默认值Get objName 属性 用于拦截form ...

  5. form表单 ----在路上(15)

    form 表单就是将用户的信息提交到服务器,服务器会将信息存储活着根据信息查询数据进行增删改查,再将其返回给用户. 基本格式: <form action="" method ...

  6. 了解HTML表单之form元素

    前面的话 表单是网页与用户的交互工具,由一个<form>元素作为容器构成,封装其他任何数量的表单控件,还有其他任何<body>元素里可用的标签 表单能够包含<input& ...

  7. form表单的字符串进行utf-8编码

    <form>表单有assept-charset属性.该属性规定字符的编码方式,默认是"unknown",与文档的字符集相同. 该属性除了Internet explore ...

  8. js Form.elements[i]的使用实例

    function pdf(){    //一个html里面可能存在多个form,所以document.form[0]指的是第一个form,document.form[1]返回就是第二个form,如果没 ...

  9. PHP跨域form提交

    因为安全性因素,直接跨域访问是不被允许的. 1.PHP CURL方式 function curlPost($url,$params) { $postData = ''; foreach($params ...

  10. C#模拟HTTP Form请求上传文件

    using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO ...

随机推荐

  1. SpringBoot实现微信小程序登录的完整例子

    目录 一.登录流程 二.后端实现 1.SpringBoot项目结构树 2.实现auth.code2Session 接口的封装 3.建立用户信息表及用户增删改查的管理 4.实现登录认证及令牌生成 三.前 ...

  2. conda虚拟环境安装

    一.背景 需要学习mxnet,建一个conda虚拟软件环境. 二.步骤 1.下载anaconda安装文件:https://mirrors.tuna.tsinghua.edu.cn/anaconda/m ...

  3. “造轮运动”之 ORM框架系列(一)~谈谈我在实际业务中的增删改查

    想想毕业已经快一年了,也就是大约两年以前,怀着满腔的热血正式跨入程序员的世界,那时候的自己想象着所热爱的技术生涯会是多么的丰富多彩,每天可以与大佬们坐在一起讨论解决各种牛逼的技术问题,喝着咖啡,翘着二 ...

  4. 手写 new

    /* 基于内置的 new 关键词,我们可以创建 Dog 的一个实例 zhangsan ,实例可以调用原型上的属性和方法 需求:自己实现一个 _new 方法,也可以模拟出内置 new 后的结果 */ / ...

  5. Java实现蓝桥杯模拟递增三元组

    问题描述 在数列 a[1], a[2], -, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a ...

  6. Java实现 LeetCode 133 克隆图

    133. 克隆图 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node { ...

  7. Java实现 LeetCode 113 路径总和 II

    113. 路径总和 II 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = ...

  8. Java实现 LeetCode 87 扰乱字符串

    87. 扰乱字符串 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = "great" 的一种可能的表示形式. grea ...

  9. Java实现第九届蓝桥杯星期一

    星期一 整个20世纪(1901年1月1日至2000年12月31日之间),一共有多少个星期一? (不要告诉我你不知道今天是星期几) 注意:需要提交的只是一个整数,不要填写任何多余的内容或说明文字. 解: ...

  10. java实现第七届蓝桥杯骰子游戏

    骰子游戏 PS: 骰子哪有从0开始的只能是1-6,而他i j k的范围都是0-5,所以都要加1 题目描述 我们来玩一个游戏. 同时掷出3个普通骰子(6个面上的数字分别是1~6). 如果其中一个骰子上的 ...