在Flask的开发的学习过程中,我用的是李辉大神的狼书,在实际学习中遇到的以下坑,与各位分享:
1.flask 的 Submit 按钮提交后并不会跳转,仍然停留在原始输入界面,部分代码如下:
forms.py 表单函数
1 class RichTextForm(FlaskForm): 2 title = StringField('Title', validators=[DataRequired(), Length(1, 50)]) 3 body = CKEditorField('Body', validators=[DataRequired()]) 4 submit = SubmitField('Publish')
app.py 视图函数
1 @app.route('/ckeditor', methods=['GET', 'POST']) 2 def integrate_ckeditor(): 3 form = RichTextForm() 4 if form.validate_on_submit(): 5 title = form.title.data 6 body = form.body.data 7 flash('your post is post') 8 return render_template('post.html', title=title, body=body) 9 return render_template('ckeditor.html', form=form)
渲染模版 ckeditor
{% block content %} <h1>Integrate CKEditor with Flask-CKEditor</h1> <form method="post"> {{ form.csrf_token }} {{ form_filed(form.title) }} {{ form_filed(form.body) }} {{ form.submit }} </form> {% endblock %}
运行后的界面
问题描述:
当输入内容点击Submit后,依然停留在此界面,即并不会跳转至‘post.html'模版,说明是IF 语句出错,但
form.validate_on_submit 相当于 用户提交表单and数据通过验证 ,问题应该是数据通过验证这一块,排查其余代码无问题后,最终发现’ckedior.html'中的语句
{{ form.csrf_token }} 出错,即CSRF令牌拼写错误,故无法通过验证,但程序并不会报错,对于初学者是比较大的坑,共勉!!
2. 出现报错:TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given
代码如下:
1 #Form 2 class NewNoteForm(FlaskForm): 3 body = TextAreaField('Body', validators=[DataRequired])
# 3更改为(body = TextAreaField('Body', validators=[DataRequired()]))
4 submit = SubmitField('Save') 5 6 @app.route('/new ', methods=['GET', 'POST']) 7 def new_note(): 8 form = NewNoteForm() 9 if form.validate_on_submit(): 10 body = form.body.data 11 note = Note(body=body) 12 db.session.add(note) 13 db.session.commit() 14 flash('Your note is saved') 15 return redirect(url_for('index')) 16 return render_template('new_note.html', form = form)
根据报错提示,函数需要两个参数,但是给了三个,并且在运行创建新Note提交时报错,说明错误在创建的Note的表单上,仔细排查后发现DataRequired后面没有括号,导致被当成了参数,因此报错,加了括号后恢复。今后在书写上注意。