Flask学习之三 web表单
本部分Miguel Grinberg教程的翻译地址:http://www.pythondoc.com/flask-mega-tutorial/webforms.html
开源中国的:http://www.oschina.net/translate/the-flask-mega-tutorial-part-iii-web-forms
英文原文地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms
PS.建议英语比较好直接看英文博客,因为中文翻译可能会有问题,而且有问题英文博客那边会进行修改,但是中文翻译是不会再修改的。
关于表单:Web 表单是在任何一个 web 应用程序中最基本的一部分。我们将使用表单允许用户写文章,以及登录到应用程序中。
一、配置
教程:为了能够处理 web 表单,我们将使用 Flask-WTF ,该扩展封装了 WTForms 并且恰当地集成进 Flask 中。
因为许多 Flask 扩展需要大量的配置,比较方便的做法是在 microblog 文件夹的根目录下创建一个配置文件 config.py:
CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
aaarticlea/png;base64,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" alt="" />
教程:CSRF_ENABLED 配置是为了激活 跨站点请求伪造 保护。在大多数情况下,你需要激活该配置使得你的应用程序更安全些。
SECRET_KEY 配置仅仅当 CSRF 激活的时候才需要,它是用来建立一个加密的令牌,用于验证一个表单。当你编写自己的应用程序的时候,请务必设置很难被猜测到密钥。
在写好配置文件之后,我们需要告诉Flask如何读取和使用它。修改app/__init__.py:
from flask import Flask app = Flask(__name__)
app.config.from_object('config') from app import views
二、用户登录表单
教程:在 Flask-WTF 中,表单是表示成对象,Form 类的子类。一个表单子类简单地把表单的域定义成类的变量。
这里的登录表单不是用户名/密码类型,而是OpenID。(对于这个东西目前其实我比较的迷茫)
教程:OpenID 登录仅仅需要一个字符串,被称为 OpenID。我们将在表单上提供一个 ‘remember me’ 的选择框,以至于用户可以选择在他们的网页浏览器上种植 cookie ,当他们再次访问的时候,浏览器能够记住他们的登录。
第一个表单(文件 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)
注意:这里如果看中文翻译的教程,是没办法正常执行的,以上的代码是英文博客。
备注:在flask-wtf的0.9版之后已经不可用。
见 https://flask-wtf.readthedocs.org/en/latest/upgrade.html#version-0-9-0
0.9版之后的flask-wtf的结构有了不小的改动,如果遇到问题,可以先去看看官方文档。
aaarticlea/png;base64,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" alt="" />
三、表单模板
就是html布局,代码如下(文件 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=80)}}<br>
</p>
<p>{{form.remember_me}} Remember Me</p>
<p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}
在我们所有模板中,都应该继承base.html,用以保证布局的一致性。
教程:模板期望一个实例化自我们刚才创建地表单类的表单对象储存成一个模板参数,称为 form。当我们编写渲染这个模板的视图函数的时候,我们将会特别注意传送这个模板参数到模板中。
form.hidden_tag() 模板参数将被替换为一个隐藏字段,用来是实现在配置中激活的 CSRF 保护。如果你已经激活了 CSRF,这个字段需要出现在你所有的表单中。
我们表单中实际的字段也将会被表单对象渲染,你只必须在字段应该被插入的地方指明一个 {{form.field_name}} 模板参数。某些字段是可以带参数的。在我们的例子中,我们要求表单生成一个 80 个字符宽度的 openid 字段。
因为我们并没有在表单中定义提交按钮,我们必须按照普通的字段来定义。提交字段实际并不携带数据因此没有必要在表单类中定义。
aaarticlea/png;base64,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" alt="" />
四、表单视图
要在浏览器看到登录页面,还需要一个有登录页面的表单视图。修改(文件 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)
上面的代码做了一件事就是在路由装饰器中添加一个新方法。让 Flask 明白我们这个视图函数支持 GET 和 POST 请求。否则这个视图函数只会响应 GET 请求。我们需要得到用户填写表单后提交的数据,这些数据是从 POST 请求中传递过来的。
可以登录URL http://127.0.0.1:5000/login 看看效果。现在还没写接收数据,所以怎么按提交按钮都是不会有效果的。
注意:以上是新修改的部分,可以不删除而在下面进行增加的,如下:
from app import app
from flask import render_template, flash, redirect
from forms import LoginForm @app.route('/')
@app.route('/index')
def index():
user = { 'nickname': 'Miguel'} # fake user
return render_template("index.html",
title = 'Home',
user = user) @app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
return render_template('login.html',
title = 'Sign In',
form = form)
这样http://127.0.0.1:5000这个URL才能继续使用,否则就只能用 http://127.0.0.1:5000/login 这个URL。只用博客中的代码http://127.0.0.1:5000这个URL就会变成404 NOT FOUND
五、接收数据
修改登录视图函数,它验证并且存储表单数据 (文件 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)
validate_on_submit 方法做了所有表单处理工作。当表单正在展示给用户的时候调用它,它会返回 False.
如果 validate_on_submit 在表单提交请求中被调用,它将会收集所有的数据,对字段进行验证,如果所有的事情都通过的话,它将会返回 True,表示数据都是合法的。这就是说明数据是安全的,并且被应用程序给接受了。
当 validate_on_submit 返回 True,我们的登录视图函数调用了两个新的函数,导入自 Flask。flash 函数是一种快速的方式下呈现给用户的页面上显示一个消息。在我们的例子中,我将会使用它来调试,因为我们目前还不具备用户登录的必备的基础设施,相反我们将会用它来显示提交的数据。flash 函数在生产服务器上也是十分有作用的,用来提供反馈给用户有关的行动。
redirect 这个函数告诉网页浏览器引导到一个不同的页面而不是请求的页面。在我们的视图函数中我们用它重定向到前面已经完成的首页上。
闪现的消息将不会自动地出现在我们的页面上,我们的模板需要加入展示消息的内容。我们将添加这些消息到我们的基础模板中,这样所有的模板都能继承这个函数。这是更新后的基础模板(文件 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 message = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li> {{ message }} </li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
六、加强字段验证
现阶段的应用程序,如果表单提交不合理的数据将不会被接受。相反,会返回表单让用户提交合法的数据。但我们还需要告诉用户他哪里出错了。
Flask-WTF 也能够轻易地做到这一点。
当字段验证失败的时候, Flask-WTF 会向表单对象中添加描述性的错误信息。这些信息是可以在模板中使用的,因此我们只需要增加一些逻辑来获取它。
再修改登录模板(文件 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=80)}}<br>
{% for error in form.errors.openid %}
<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 %}
aaarticlea/png;base64,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" alt="" />
七、处理 OpenIDs
教程:
事实上,很多用户并不知道他们已经有一些 OpenIDs。一些大的互联网服务提供商支持 OpenID 认证自己的会员这并不是众所周知的。比如,如果你有一个 Google 的账号,你也就有了一个它们的 OpenID。
为了让用户更方便地使用这些常用的 OpenID 登录到我们的网站,我们把它们的链接转成短名称,用户不必手动地输入这些 OpenID。
首先开始定义一个 OpenID 提供者的列表,把它们写入我们的配置文件中(文件 config ):
WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess' 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'}]
修改登录视图函数中(文件 app/views.py):
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID="%s", remember_me=%s' %
(form.openid.data, str(form.remember_me.data)))
return redirect('/index')
return render_template('login.html',
title='Sign In',
form=form,
providers=app.config['OPENID_PROVIDERS'])
从配置中获取 OPENID_PROVIDERS,接着把它作为 render_template 中一个参数传入模板中。
在登录模板中渲染这些提供商的链接(文件 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 != -1) {
// openid requires username
user = prompt('Enter your ' + pr + ' username:')
openid = openid.substr(0, 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=80) }}
{% 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 %}
一些 OpenIDs 含有用户名,因此对于这些用户,我们必须利用 javascript 的魔力提示用户输入用户名并且组成 OpenIDs。当用户点击一个 OpenIDs 提供商的链接并且(可选)输入用户名,该提供商相应的 OpenID 就被写入到文本域中。
修改后的登录页面:
aaarticlea/png;base64,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" alt="" />
BY笔者:
我看到最后才大概理解OpenID是什么,感觉大概意思就像是用腾讯或者新浪帐号去登录其他网站或者应用是类似的感觉。
Flask学习之三 web表单的更多相关文章
- Flask学习 三 web表单
web表单 pip install flask-wtf 实现csrf保护 app.config['SECRET_KEY']='hard to guess string' # 可以用来存储框架,扩展,程 ...
- Flask之模板web表单
3.3 Web表单: web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过 ...
- Flask:处理Web表单
尽管 Flask 的请求对象提供的信息足以处理 Web 表单,但有些任务很单调,而且要重复操作.比如,生成表单的 HTML 代码和验证提交的表单数据.Flask-WTF 扩展可以把处理 Web 表单的 ...
- Flask 里的WEB表单应用
它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器. 创建模板文件 login. ...
- 基于Flask框架搭建视频网站的学习日志(三)之原始web表单
基于Flask框架搭建视频网站的学习日志(三)1.原始Web 表单 本节主要用于体验一下前端后端直接数据的交互,样例不是太完善,下一节会加入Flash处理,稍微完善一下页面 (备注:建议先阅读廖雪峰老 ...
- Flask Web Development —— Web表单(上)
Flask-WTF扩展使得处理web表单能获得更愉快的体验.该扩展是一个封装了与框架无关的WTForms包的Flask集成. Flask-WTF和它的依赖集可以通过pip来安装: (venv) $ p ...
- flask 利用flask_wtf扩展 创建web表单
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能 创建语句格式: startTime = DateTimeField('计划开 ...
- Python——Flask框架——Web表单
一.框架Flask-WTF 安装: pip install flask-wtf 需要程序设置一个密钥 app = Flask(__name__) app.config['SECRET_KEY'] = ...
- Flask教程 —— Web表单(上)
第二章中介绍的request对象公开了所有客户端发送的请求信息.特别是request.form可以访问POST请求提交的表单数据. 尽管Flask的request对象提供的支持足以处理web表单,但依 ...
随机推荐
- JavaScript中this的指向2(转载)
1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法. 2. 相同点:这两个方法的作用是一样的. 都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖 ...
- 让footer始终待在页面底部
1.把html和body的height属性设为100%;保证content的高度能撑满浏览器; 2.把#content的高度也设置为100% ,但是这里我们使用了“min-height”属性,而不是的 ...
- CesiumLab V1.1 新功能 (免费Cesium处理工具集)
Cesiumlab 自从上周(3月20日)发布之后,赢得小伙伴一致好评. 本周继续推出重大更新: 建筑物矢量数据 转 3dtiles, 建筑物矢量数据 转 3dtiles, 建筑物矢量数据 转 3 ...
- Web前端开发工程师需要掌握哪些核心技能?
Web前端开发所涉及的内容主要包括W3C标准中的结构.行为和表现,那么这三项中我们需要掌握的核心技能是什么呢? 1.开发语言 HTML发展历史有二十多年,历经多次版本更新,HTML5和CSS3的出现又 ...
- Redhat/Fedora 网络接口的配置文件和网络接口专用配置工具
在Redhat/Fedora 中,与乙太网卡相关的配置文件位于 /etc/sysconfig/network-scripts目录中,比如 ifcfg-eth0.ifcfg-eth1 .... .... ...
- windows 操作系统下git报filename too long 处理方法
两种方法解决: 一是通过修改配置文件 [core] repositoryformatversion = filemode = false bare = false logallrefupdates = ...
- 阿里云合作伙伴峰会SaaS加速器专场 | 商业加持,迈进亿元俱乐部
导语:本文中,阿里云智能运营专家朱以军从宏观角度分析了SaaS市场的机遇和挑战,重点介绍了阿里云的商业操作系统.同时,阿里云SaaS加速器也在招募更多ISV合作伙伴和我们一起共创专注面向未来的应用,用 ...
- 小米网关api
http://bbs.xiaomi.cn/t-13198850 https://github.com/snOOrz/homebridge-aqara/blob/master/README.md htt ...
- 微信小程序开发之图片等比例缩放 获取屏幕尺寸图片尺寸 自适应
wxml: <image style="width: {{imagewidth}}px; height: {{imageheight}}px;" src="{{i ...
- 2017年浙工大迎新赛热身赛 J Forever97与寄信 【数论/素数/Codeforces Round #382 (Div. 2) D. Taxes】
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K64bit IO Format: %lld 题目描述 Forever97与未央是一对笔友,他们经常互 ...