## 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. vc程序设计--图形绘制2

    // 实验2.cpp : 定义应用程序的入口点. // #include "framework.h" #include "实验2.h" #define MAX_ ...

  2. go语言的主要特征

    go语言主要特征 1.自动立即回收. 2.更丰富的内置类型. 3.函数多返回值. 4.错误处理. 5.匿名函数和闭包. 6.类型和接口. 7.并发编程. 8.反射. 9.语言交互性. golang文件 ...

  3. JAVASE(七)面向对象:封装性(特性之一)、构造器、属性、关键字

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.封装性 1.为什么要使用封装性? 创建对象以后,可以通过对象.属性名的方法进行赋值.只能限制数据的类 ...

  4. 高性能可扩展mysql 笔记(六) SQL执行计划及分页查询优化、分区键统计

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 常见业务处理 一.使用数据库处理常见业务: 案例: 如何对评论进行分页展示 使用 EXPLAIN 获得s ...

  5. 如何获取CSDN的积分?

    个人感觉就是写博客就给积分 具体给多少? CSDN应该有自己的积分规则 总之一句话:写博客涨积分

  6. Java实现 蓝桥杯VIP 算法训练 Car的旅行路线

    大家可以看一下这个,蓝桥杯官网的这道题是有问题的 Car的旅行路线 算法训练 Car的旅行路线 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 查看参考代码 问题描述 又到暑假 ...

  7. java实现求逆序对

    1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度百科: 设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相 ...

  8. linux下gdb调试方法与技巧整理

    参考博客:  https://blog.csdn.net/niyaozuozuihao/article/details/91802994 1.运行命令run:简记为 r ,其作用是运行程序,当遇到断点 ...

  9. mysql基础之-mysql锁和事务(七)

    0x01 MySQL锁: 执行操作时施加锁的模式 读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁 不会对其他用户进行阻塞 理解: ----->(这里的不阻塞,是可以 ...

  10. redis 数据删除策略和逐出算法

    数据存储和有效期 在 redis 工作流程中,过期的数据并不需要马上就要执行删除操作.因为这些删不删除只是一种状态表示,可以异步的去处理,在不忙的时候去把这些不紧急的删除操作做了,从而保证 redis ...