flask-wtf的使用
说到flash的使用很自然的就会想到在flask框架中,由于并没有像Django这种重量级框架,在各种方面做了较为完善的功能,比如admin"爸爸",很多需要通过使用第三方库进行实现,例如在进行数据校验时,使用了flask-wtf package,用来获取前端的表单数据,简易具体代码如下:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo
class RegisterForm(FlaskForm):
# 说明标签,检验器,保证数据必须填写并且不能为空
user_name = StringField(label="用户名", validators=[DataRequired("用户名不能为空")])
# DataRequired中展示的是如果出现错误后展现的错误信息.在前段中将会产生DataRequired内容,可以通过遍历form.user_name.errors进行逐条查看
password = PasswordField(label="密码", validators=[DataRequired("密码不能为空")])
password2 = PasswordField(label="确认密码", validators=[DataRequired("确认密码不能为空"), EqualTo("password","两次密码不一致")])
submit = SubmitField(label="提交")
如果使用过Django你一定会发现,啊呖呖,为什么这么像Django中的模型类,长得很像,其中label表示在前段中显示的名称,比如在前段中
form.user_name.label
(这里居然开了禁止转义,这…这句会有p标签)就会显示出"用户名".2. 注意如果使用了flask的form方法,那么在前端中可以简化代码,简化格式如下
8 <form method="post">
9 {{ form.csrf_token }}
10 {{ form.user_name.label }}
11 <p>{{ form.user_name }}</p>
12 {% for msg in form.user_name.errors %}
13 <p> {{ msg }}</p>
14 {% endfor %}
15 {{ form.user_name.label }}
16 <p>{{ form.password }}</p>
17 {% for msg in form.password.errors %}
18 <p> {{ msg }}</p>
19 {% endfor %}
20 {{ form.password2.label }}
21 <p>{{ form.password2 }}</p>
22 {% for msg in form.password2.errors %}
23 <p> {{ msg }}</p>
24 {% endfor %}
25 {{ form.submit }}
26 </form>
3. 为了实现前后端交互,因为大家都是python框架,那就用Django进行对比好了
由于Django是基于ORM的MVT框架,因此视图函数是用来操作数据库和调用前端template,传递接受前端数据中必须使用的,在flask中为了保证框架的轻量化设计,在框架设计之处,我们使用最简单的框架,不导入第三方package的情况下,通常只进行V和T的交互,也就是Views和template的交互,…略去一些,直接(ˉ▽ ̄~) 切入正题,为了使用flask-wtf的数据进行检验,(这里前端检验一遍,后端检验一遍,这个是最基本的要求啦==),直接上代码:
@app.route("/register", methods=["GET", "POST"])
31 def register():
32 form = RegisterForm()
33 # 如果form中的数据完全满足所有的验证器,则返回真,否则返回为假,这里传入数> 据后进行跳转
34 # 验证合格
35 if form.validate_on_submit():
36 # 获取数据
37 uname = form.user_name.data
38 #
39 pwd = form.password.data
40 pwd2 = form.password2.data
41 print(uname, pwd, pwd2)
42 session["user_name"] = uname
43 return redirect(url_for("index"))
44 return render_template("register.html", form=form)
具体参数如下,首先需要调用之前的表单认证类,这个类中有一个validate_on_submit的放方法,这表示如果数据获取不完整后者数据校验不合格,比如没填数据,或者密码前后两次不一致,等,False,只用也就是说,只用这一个方法,就会省去很多费时的if判断语句.不过只是这样你如果运行一定会爆出类似这样的错误**(这里划重点)**因为处理的方式都相同
RuntimeError: The session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.
这里是需要设置secret_key,使用配置
app.config["SECRET_KEY"] = "自己随意写,如果不是在生产环境",这里app是Flask()方法指向的
这里需要解释一下,因为flask直接将session扔进了cookie里,通常是不会这么做的,不过flask这么做了,这也就是受flask需要对这段数据进行加密,你穿的数据就是用来加密的秘钥,另外为了防止csrf攻击同样需要secret_key,同时,在表单中加上{{form.csrf_token}}这里和Django类似了,在Django的模板中也会使用到 csrf_token进行防止csrf攻击.总秘钥什么的先写上就行了,这样就不会这样宕着,(⊙o⊙),通过以上就可以实现,一个简单的登录操作.
不过因为没有重定向方法,所以你大概只能原地转圈圈=-=.
作者码子不容易,如需转载或者引用,请注明出处,米娜桑,祝君武运昌隆.