在写add_article部分代码的时候又遇到了,类似的问题,天啊,下午有郁闷了好久,吃完饭,在Web 表单里加上了CSRF 密钥,然后代码可以正常运行了
{% extends 'layout.html' %}
{% block body %}
<h1>Add Artitle</h1>
{% from "includes/_formhelpers.html" import render_field %}
<form method="POST",action="">
{{ form.csrf_token }}
<div class="form-group">
{{render_field(form.title,class_="form-control")}}
</div>
<div class="form-group">
{{render_field(form.body, class_="form-control")}}
</div>
<p><input type="submit" class="btn btn-primary" value="Submit"></p>
</form>
{% endblock %}
修改于2017年7月31日
好久没有写这个 Problems & Solutions 了。
这两天,写了那么多行用户注册代码,结果在网页上注册点击Submit,没反应,天啊,还好最后解决了问题。
form.validate() 和 form.validate_on_submit() 的问题。
还好找到了解决这类问题的思路。
排除没有问题的代码,找到出问题的代码,再注释掉不重要的代码,调试程序,看问题具体出在哪行代码,再上网查解决办法。
Problems:
发现问题在这一块儿代码:
def register():
form = RegisterForm(request.form)
if request.method == 'POST' and form.validate():
name = form.name.data
email = form.email.data
username = form.username.data
password = sha256_crypt.encrypt(str(form.password.data))
##Creat cursor
cur = mysql.connection.cursor()
#Execute query
cur.execute("INSERT INTO users(name, email, username, password) VALUES(%s, %s, %s, %s)",(name, email,username,password))
#Commit to DB
mysql.connection.commit()
#Close connection
cur.close()
flash("You are now registered.Please log in.",'success')
return redirect(url_for('index'))
return render_template('register.html',form=form)
中间一堆都是按文档上的例子,最有可能出错的时 if 条件语句.
把代码改成这样:
def register():
form = RegisterForm(request.form)
if request.method == 'POST' and form.validate():
return redirect(url_for('index'))
return render_template('register.html',form=form)
用户注册后点击Submit,仍然页面仍然留在了当前注册页面,就是程序根本没有执行if 判断语句中的内容,然后if 条件语句中有两个判断条件:
if request.method == 'POST' and form.validate_on_submit():
删掉request.method == ‘POST’,页面留在当前注册页面.
删掉form.validate_on_submit(),页面跳转到了index.html
自然form.validate()语句这儿
Solutions:
validate() 函数用来验证数据。如果验证通过,则 函数返回 True ,否则返回 False 。
使用 WTForms 进行表单验证的视图部分用了form.validate()方法,就跟着把form.validate()用到了自己的代码中.
validate() 函数来验证数据。如果验证通过,则 函数返回 True ,否则返回 False 。
关于validate_on_submit():
validate_on_submit() method of the form returns True when the form was submitted and the data has been accepted by all the field validators.
把validate() 替换成validate_on_submit(),页面跳转到了index页面.
把刚才删掉的代码加上(保存用户信息到MySQL数据库)
果然用户注册成功,注册信息也保存到了数据库中。
(flash消息看起来有些问题,但是这种明显就能知道哪儿错了的错误,一点儿都可怕)