这是我撰写的关于利用基于python的flask框架开发web应用系列文章的第3部分。
该系列文章的目的是建立一个功能完善的微博应用,我决定称它为microblog,虽然这个名字没什么创意。(引用第2部分翻译)
一下是该系列所有已发布文章的索引:
使用 OpenId 登录只需要一个字符串,然后发送给 OpenId 服务器就行了。另外我们还需要在表单中加一个“记住我” 的选项框,这个是送给那些不想每次来我们网站都要进行身份认证的人。选择这个选项后,首次登录时会用cookie在他们的浏览器上记住他们的登录信息,下次再进入网站时就不需要进行登录操作。
开始我们的第一个表单吧 (fileapp/forms.py):
from flask.ext.wtf import Form, TextField, BooleanField from flask.ext.wtf import Required class LoginForm(Form): openid = TextField('openid', validators = [Required()]) remember_me = BooleanField('remember_me', default = False)欣赏一下这个类,多么的简洁,多么的一目了然。如此简单,但又十分的富有内涵。我们引入了一个 Form 类,然后继承这个类,按需求还添加了 TextField 和 BooleanField 这两个字段。
另外还引入了一个表单验证函数 Required,这种验证函数可以附加在字段里面,在用户提交表单时它们会用来检查用户填写的数据。这个 Required 函数是用来防止用户提交空数据。Flask-WTF 中还有很多不同作用的表单验证函数,我们将会在后面使用到它们。
现在我们的问题就是需要一个显示这个登录表单的模板。好消息是我们刚刚创建的登录表单类知道如何把字段转换成HTML,所以我们只需要把注意力集中到页面布局上。下面就是我们的登录表单的模板 (fileapp/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 %}容我啰嗦一下,在这个模板中,我们又一次使用了模板继承的方式。使用 extends 语句从 base.html 继承模板内容。我们会在后面创建的模板中继续使用这种方式,这样可以使我们所有的页面布局保持一致。
见证奇迹的时刻最后一步,我们马上要来写一个渲染登录表单对象到模板的视图函数。
这个函数相当的简单无趣,因为我们只需要把表单对象传递给模板就行了。下面就是我们这个视图函数的全部内容 (fileapp/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)我们引入登录表单类,然后把它实例化到一个变量,最后再把这个变量传给模板。要渲染表单字段必须的事情也就这些。
上面的代码中还引入了两个新对象: falsh 和 redirect, 这个先甭理它们,稍后才用得上。
评论删除后,数据将无法恢复
评论(25)
引用来自“不必在乎朕是谁”的评论
引用来自“zhangdedezhu”的评论
No module named flask.ext.wtf 一直提示这个错误,但是明明在第一步的时候装过了,这是为什么
貌似这个包变成了 WTForms
from flask_wtf import FlaskForm
引用来自“jeffsui”的评论
问题解决了,flask0.9版本之后,需要安装flask-wtf和WTForms,然后修改导入的包:from flask.ext.wtf import Form
from wtforms.fields import TextField,StringField,BooleanField
from wtforms.validators import DataRequired
就可以了
引用来自“夜不成寐”的评论
运行以后报错views.py,No module named 'forms',明明forms.py 和views.py是放在同一目录下的,求解引用来自“jeffsui”的评论
问题解决了,flask0.9版本之后,需要安装flask-wtf和WTForms,然后修改导入的包:from flask.ext.wtf import Form
from wtforms.fields import TextField,StringField,BooleanField
from wtforms.validators import DataRequired
就可以了
from flask.ext.wtf import Form
from wtforms.fields import TextField,StringField,BooleanField
from wtforms.validators import DataRequired
就可以了
引用来自“罗泽轩”的评论
原文中的:from flask.ext.wtf import Form, TextField, BooleanField
from flask.ext.wtf import Required
在flask-wtf的0.9版之后已经不可用。
见 https://flask-wtf.readthedocs.org/en/latest/upgrade.html#version-0-9-0
0.9版之后的flask-wtf的结构有了不小的改动,如果遇到问题,可以先去看看官方文档。
引用来自“zhangdedezhu”的评论
引用来自“不必在乎我是谁”的评论
引用来自“zhangdedezhu”的评论
No module named flask.ext.wtf 一直提示这个错误,但是明明在第一步的时候装过了,这是为什么
貌似这个包变成了 WTForms
引用来自“X-Alvin”的评论
登入login显示:unbound method hidden_tag() must be called with LoginForm instance as first argument (got nothing instead)怎么解决啊,我知道是实例化的问题,不过form不是已经是实例化的了么引用来自“罗泽轩”的评论
原文中的:from flask.ext.wtf import Form, TextField, BooleanField
from flask.ext.wtf import Required
在flask-wtf的0.9版之后已经不可用。
见 https://flask-wtf.readthedocs.org/en/latest/upgrade.html#version-0-9-0
0.9版之后的flask-wtf的结构有了不小的改动,如果遇到问题,可以先去看看官方文档。
引用来自“爱已欠费停机”的评论
ImportError: No module named flask.ext.wtf 报这错的时候得装这个 pip install -U Flask-WTF 接着把forms.py这里改为 from flask.ext.wtf import Form from wtforms import TextField, BooleanField from wtforms.validators import Required 及可运行引用来自“罗泽轩”的评论
原文中的:from flask.ext.wtf import Form, TextField, BooleanField
from flask.ext.wtf import Required
在flask-wtf的0.9版之后已经不可用。
见 https://flask-wtf.readthedocs.org/en/latest/upgrade.html#version-0-9-0
0.9版之后的flask-wtf的结构有了不小的改动,如果遇到问题,可以先去看看官方文档。