## 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. 【docker系列2】docker 的前世今生

    Docker 入门,共 3 篇,将带大家进入 Docker 的世界.首先了解 Docker 的发展历程, 然后快速掌握 Docker 的基本使用: Docker 版本及内核兼容性选择是这部分的重点内容 ...

  2. Java实现 LeetCode 798 得分最高的最小轮调 (暴力分析)

    798. 得分最高的最小轮调 给定一个数组 A,我们可以将它按一个非负整数 K 进行轮调,这样可以使数组变为 A[K], A[K+1], A{K+2], - A[A.length - 1], A[0] ...

  3. Java实现 蓝桥杯 基础练习 数列特征

    基础练习 数列特征 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 给出n个数,找出这n个数的最大值,最小值,和. 输入格式 第一行为整数n,表示数的个数. 第二行有 ...

  4. Java实现 LeetCode 343 整数拆分(动态规划入门经典)

    343. 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × ...

  5. Java中TreeSet的详细用法

    第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet, Clonea ...

  6. Java实现 LeetCode 19删除链表的倒数第N个节点

    19. 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当 ...

  7. Java实现蓝桥杯历届试题区间移位

    问题描述 数轴上有n个闭区间D1,-,Dn.其中区间Di用一对整数[ai, bi]来描述,满足ai < bi.已知这些区间的长度之和至少有10000.所以,通过适当的移动这些区间,你总可以使得他 ...

  8. 第八届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.平方十位数 题目描述 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比 ...

  9. java实现第六届蓝桥杯无穷分数

    无穷分数 无穷分数 无穷的分数,有时会趋向于固定的数字. 请计算[图1.jpg]所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0. 请填写该浮点数,不能填写任何多余的内容. 结果:0 ...

  10. 查询局域网指定段内存活IP

    目录 批量ping 输出到指定文件 批量ping for /L %i IN (起始,扫描间距,结束) DO ping -w 2 -n 1 10.224.131.%i 如 for /L %i IN (5 ...