Tommonkey

All greatness comes from a brave beginning

0%

Flask之Web表单

吼吼吼!618打折买的Flash Web开发这本书已经看到Web表单的处理了,接下来估计难度还会加大,所以想暂停一下整理整理。我总结的方式可以比较独特,并不是像上学读书时候那样一条条的列出知识点,而是直接写一个简单的应用,并且在认为重要的地方写上注释,所以这篇文章可能对部分人感到不适噢!

本篇文章中用到的基础包

  • flask:主要实现了路由分发和模板渲染功能, 分别集成自Werkzeug和 Jinja2模块包, 这两个也是Flask框架的核心,通过pip install flask安装
  • flask_bootstrap:是Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,通过pip install flask-bootstrap安装
  • flask_wtf:提供了简单地 WTForms 的集成,通过pip install flask-wtf安装
  • wtform:一个灵活的表单,渲染和验证库,已经被集成在flask-wtf中

表单之收集个人信息举例

py文件部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Author: Tommonkey
# Data: 2022/7/17
# Blog: https://www.tommonkey.cn
#
# 信息收集表单示例
# -----------------------------------------------------------------
from flask import Flask,session,render_template,redirect,url_for,flash
from flask_bootstrap import Bootstrap # 定义基模板
from flask_wtf import FlaskForm # 定义表单
from wtforms import StringField,SubmitField,PasswordField,DateTimeField # 定义检验
from wtforms.validators import DataRequired,Email,EqualTo,Length

# 创建应用对象
app = Flask(__name__)
# 设置密钥,防止CSRF攻击
app.config["SECRET_KEY"] = "Tommonkey"
# 调用bootstrap,后面就可以方便使用其里面的基模板了
base_template = Bootstrap(app)

# text-align:center---->文字设置水平居中
# width,height:设置框框的宽高
# margin:自适应宽高,设置margin:0 auto 框框实现水平居中效果
# placeholder:提供可描述输入字段预期值的提示信息
# render_kw:可以通过键值对的形式传入一些css样式,但功能有限

# 构造表单字段,继承自FlaskForm
class UserInfo(FlaskForm):
user_name = StringField("what's your name",validators=[DataRequired("姓名不能为空"),Length(1,10)],render_kw=
{
"class":"sheet_style",
"style":"width:300px;height:45px;margin:0 auto;",
"placeholder":"your name",
})

user_sex = StringField("your sex",validators=[DataRequired(),Length(1,4)],render_kw=
{
"class":"sheet_style",
"style":"width:300px;height:45px;margin:0 auto",
"placeholder":"your sex",
})

user_born = DateTimeField("when's your born",render_kw=
{
"class":"sheet_style",
"style":"width:300px;height:45px;margin:0 auto",
"placeholder": "your born",
})

user_email = StringField("what's your Email",validators=[DataRequired(),Email()],render_kw=
{
"class":"sheet_style",
"style":"width:300px;height:45px;margin:0 auto",
"placeholder":"your email",
})

user_password = PasswordField("create your password",validators=[Length(1,15)],render_kw=
{
"class":"sheet_style",
"style":"width:300px;height:45px;margin:0 auto",
"placeholder":"your password",
})

user_password_confirm = PasswordField("confirm your password",description="确认你的密码",validators=[EqualTo("user_password","两次密码输入不一致")],render_kw=
{
"class":"sheet_style",
"style":"width:300px;height:45px;margin:0 auto",
"placeholder":"confirm password",
})

submit = SubmitField(u"submit")


@app.route("/CreateCount",methods=["POST","GET"])
def userInfo():
name = None
form = UserInfo()
if form.validate_on_submit(): # 表单提交无误
name = session.get("user_name") # 从session中取出user_name字段,若没有则返回None
flash("successed create your count!") # 闪现消息
redirect(url_for(userInfo))
return render_template("usersheet.html",form=form,name=name)


if __name__ == "__main__":
app.run(debug=True,host="127.0.0.1",port=5000)

HTML部分:
因为html会在浏览器中被解析,我加注释也不行,所以这里以图片的形式展示出来
2-1
2-2

成果展示

1-1

练习时出现的报错及解决办法

报错:local variable ‘name’ referenced before assignment

字面意思大致是说:本地变量name在之前的任务已被指定,第一眼看上去一头雾水,但出错的地方应该是这里了:
1-2
查下资料大概是说内部函数修改全局变量引起的报错,完全没想通,name咋就是全局变量了,但为了解决办法,还是加上了如下语句:
1-3
运行后成功解决……

报错:python flask raise Exception(“Install ‘email_validator‘ for email validation support

出现这种报错有三种解决办法:

  • 安装的 WTForms 模块版本过高导致,版本回退到合适版本:pip install wtforms==2.2.1
  • 安装对email支持的wtforms:pip install wtforms[email]
  • 若还不行,就用第三种办法,我就是这种办法解决的:直接安装email-validator,pip install email-validator

Info&Source

在互联网上收集了写资源,贴在这里,日后好查阅:
1-4
1-5

奖励作者买杯可乐?