使用 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!

3 Replies to “使用 Python 从 0 开发属于你的个人管理系统 11 篇 | 需要处理各种表单请求?使用 wtf 搞定”

  1. tao说道:

    百度改了两个地方才成功,老师是这样的吗?

    1. methods=[‘POST’, ‘GET’]

    2. {{form.csrf_token}}

发表回复