使用 Python 从 0 开发属于你的个人管理系统 11 篇 | 需要处理各种表单请求?使用 wtf 搞定
我们在写 web 网站的时候,常常会使用到各种表单的请求处理,比如用户名密码的提交检验,文件的提交,格式的验证等等。
你可以将上次下载的模板文件中的 login.html 放到 templates 中,渲染一下:

在这里的 HTML 中,使用了 form 标签来使用表单:
<form class="user">
<div class="form-group">
<input type="email" class="form-control form-control-user"
id="exampleInputEmail" aria-describedby="emailHelp"
placeholder="Enter Email Address...">
</div>
<div class="form-group">
<input type="password" class="form-control form-control-user"
id="exampleInputPassword" placeholder="Password">
</div>
<div class="form-group">
<div class="custom-control custom-checkbox small">
<input type="checkbox" class="custom-control-input" id="customCheck">
<label class="custom-control-label" for="customCheck">Remember
Me</label>
</div>
</div>
<a href="index.html" class="btn btn-primary btn-user btn-block">
Login
</a>
</form>其中用到了 input 标签的不同 type 来接收不通的数据——用户名,密码,记住密码,登录提交。
事实上,我们可以直接在 Python 中结合 WTF 来声明表单的类型,并且直接生成,不需要我们去写相应的 HTML。
安装 WTF
WTF 不是 what the fuck,而是 WTForm,它提供了 form 表单所有的类型生成以及数据验证。
你可以在这里找到所有 Form 的类型使用:https://wtforms.readthedocs.io/en/2.3.x/fields/#basic-fields
先进入虚拟环境安装一波:
pipenv shell
pipenv install flask-wtf
使用 WTF
安装完成之后,我们可以将上面的登录表单,用 WTF 的形式来生成。
我们定一个登录表单类,在里面定义我们需要用到的字段:用户名,密码,是否记住密码,登录提交。
用户名用到了 StringField
密码用到了 PasswordField
是否记住密码,单选框用到了 BooleanField
提交用到了 SubmitField
进入 py 文件,导入 FlaskForm 以及相关属性:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, \
BooleanField, SubmitField在 init 初始化时需要定义一下 token:
from flask import Flask
app = Flask('personal_system')
app.secret_key = 'mysystem'创建 Form
现在可以创建你的 LoginForm class 了:
class LoginForm(FlaskForm):
username = StringField('username')
password = PasswordField('password')
remember_pwd = BooleanField('remember_pwd')
login = SubmitField('login')可以定义 login 方法,生成 loginform 实例,先打印出来看看:
@app.route('/login', methods=['GET'])
def login():
login_form = LoginForm()
print(login_form.username, sys.stdout)
return render_template('login.html')当我们访问地址 http://127.0.0.1:8080/login 就会调用这个方法,打印得到的结果是:
<input id=”username” name=”username” type=”text” value=””>
看,form 的相关 HTML 已经生成,不需要我们写,我们只需要渲染过去就可以了。
渲染 Form
有了 form 数据,我们就可以将它渲染给 HTML ,在路由方法中将数据绑定过去:
@app.route('/login', methods=['GET'])
def login():
login_form = LoginForm()
return render_template('login.html', form=login_form)在 HTML 中,我们将 Form 渲染出来:
<form>
{{ form.username }}
{{ form.password }}
{{ form.remember_pwd }}
{{ form.submit }}
</form>当我们运行的时候,可以看一下源码,在这里我们得到的 HTML 就是这样的:
<form> <input id="username" name="username" type="text" value=""> <input id="password" name="password" type="password" value=""> <input id="remember_pwd" name="remember_pwd" type="checkbox" value="y"> <input id="login" name="login" type="submit" value="login"> </form>
但是直接这样生成没有样式,有亿点丑:

样式添加
我们可以使用已有的样式,将 class 中的内容应用到每个生成的 input 标签中,像这样:
<form class="user">
<div class="form-group">
{{ form.username(class="form-control form-control-user", placeholder="用户名") }}
</div>
<div class="form-group">
{{ form.password(class="form-control form-control-user", placeholder="密码")}}
</div>
<div class="form-group">
<div class="custom-control custom-checkbox small">
<input type="checkbox" class="custom-control-input" id="customCheck">
{{ form.remember_pwd(class="custom-control-input") }}
{{ form.remember_pwd.label(class="custom-control-label") }}
</div>
</div>
{{ form.login(class="btn btn-primary btn-user btn-block") }}
</form>比如这里我们使用了:
form.username(class=”form-control form-control-user”, placeholder=”用户名”)
那么将会生成:
<input class=”form-control form-control-user” id=”username” name=”username” placeholder=”用户名” type=”text” value=””>
我们现在运行一下:

好看的样式回来了!
表单的验证
另一个常用到的地方就是

OK,以上就是关于表单常用的操作,那么我们下篇见,peace!
我验证通过时候无法跳转到index页面,返回404状态码
百度改了两个地方才成功,老师是这样的吗?
1. methods=[‘POST’, ‘GET’]
2. {{form.csrf_token}}
对的