WTForms returns None 仅当输入小于3个字符时
WTForms returns None only when characters that are less than 3 are entered
所以我正在使用 Flask 制作一个网页,并使用 WTForms 从搜索栏获取输入。
如果我搜索 4 个或更多字符的任何内容,它就可以正常工作("King"、"Love"、"hate" ...等)
如果我搜索任何小于 4 的东西("as"、"for"、"the" ...等),我会从 forms.search.data
得到 "None",除非我使用 ISBN 搜索,然后我可以搜索 3 个字符或更多,但不能少于。
表单代码:
class SearchForm(FlaskForm):
search = StringField('Search', validators=[DataRequired()])
type = SelectField('Type', choices=[('title', 'Title'), ('isbn', 'ISBN'), ('author', 'Author')])
submit = SubmitField('Search')
我尝试添加 Length(min=0)
、 Length(min=1)
和 Length(min=1, max=20)
但这没有帮助。
搜索app.route代码:
@app.route("/search", methods=['GET', 'POST'])
@login_required
def search():
form = SearchForm()
session['searchresult'] = form.search.data
if form.validate_on_submit():
if form.type.data == 'title':
session['books'] = Book.bsearchtitle(title=form.search.data)
elif form.type.data == 'isbn':
session['books'] = Book.bsearchisbn(isbn=form.search.data)
elif form.type.data == 'author':
session['books'] = Book.bsearchauthor(author=form.search.data)
return redirect(url_for('results'))
return render_template('search.html', title='Search for books', form=form)
我正在使用 sessions['books']
将数据传递给结果 app.route。
结果app.route代码:
@app.route("/results")
@login_required
def results():
sbooks = session['books']
searchresult = session['searchresult']
temp = list()
for b in sbooks:
temp.append(json.loads(b))
books = list()
for t in temp:
books.append(Book(t[0], t[1], t[2], t[3], t[4]))
return render_template('results.html', title='Book search results', books=books, searchresult=searchresult)
我从 Werkzeug KeyError: 'books'
收到以下错误,它指向 ``app.route("/result").
顶部的错误
额外信息
如果我搜索 "king" 并获得结果,然后我搜索 "the" 它会转到结果页面并显示旧的 "king" 结果,但它告诉我这些是 "None" 的结果,因此 searchresult
中存储的值是 None
.
编辑 1:
所以使用VSCode调试后,在app.route("/search")
中的return redirect(url_for('results'))
处设置断点,form.search.data
和session['books']
的值是正确的。
session['books']
似乎没有传递给 app.route("/results")
。也许是因为数据库响应太大?因为当我搜索 4 个字符的单词时,该应用程序工作正常。
原来问题的原因是数据库查询响应太大,无法传递到 session['books']
。
我想一种解决方案是在 app.route("/results")
而不是 app.route("/search")
中调用数据库查询。
如果有人有任何其他想法,请分享。
所以我正在使用 Flask 制作一个网页,并使用 WTForms 从搜索栏获取输入。
如果我搜索 4 个或更多字符的任何内容,它就可以正常工作("King"、"Love"、"hate" ...等)
如果我搜索任何小于 4 的东西("as"、"for"、"the" ...等),我会从 forms.search.data
得到 "None",除非我使用 ISBN 搜索,然后我可以搜索 3 个字符或更多,但不能少于。
表单代码:
class SearchForm(FlaskForm):
search = StringField('Search', validators=[DataRequired()])
type = SelectField('Type', choices=[('title', 'Title'), ('isbn', 'ISBN'), ('author', 'Author')])
submit = SubmitField('Search')
我尝试添加 Length(min=0)
、 Length(min=1)
和 Length(min=1, max=20)
但这没有帮助。
搜索app.route代码:
@app.route("/search", methods=['GET', 'POST'])
@login_required
def search():
form = SearchForm()
session['searchresult'] = form.search.data
if form.validate_on_submit():
if form.type.data == 'title':
session['books'] = Book.bsearchtitle(title=form.search.data)
elif form.type.data == 'isbn':
session['books'] = Book.bsearchisbn(isbn=form.search.data)
elif form.type.data == 'author':
session['books'] = Book.bsearchauthor(author=form.search.data)
return redirect(url_for('results'))
return render_template('search.html', title='Search for books', form=form)
我正在使用 sessions['books']
将数据传递给结果 app.route。
结果app.route代码:
@app.route("/results")
@login_required
def results():
sbooks = session['books']
searchresult = session['searchresult']
temp = list()
for b in sbooks:
temp.append(json.loads(b))
books = list()
for t in temp:
books.append(Book(t[0], t[1], t[2], t[3], t[4]))
return render_template('results.html', title='Book search results', books=books, searchresult=searchresult)
我从 Werkzeug KeyError: 'books'
收到以下错误,它指向 ``app.route("/result").
额外信息
如果我搜索 "king" 并获得结果,然后我搜索 "the" 它会转到结果页面并显示旧的 "king" 结果,但它告诉我这些是 "None" 的结果,因此 searchresult
中存储的值是 None
.
编辑 1:
所以使用VSCode调试后,在app.route("/search")
中的return redirect(url_for('results'))
处设置断点,form.search.data
和session['books']
的值是正确的。
session['books']
似乎没有传递给 app.route("/results")
。也许是因为数据库响应太大?因为当我搜索 4 个字符的单词时,该应用程序工作正常。
原来问题的原因是数据库查询响应太大,无法传递到 session['books']
。
我想一种解决方案是在 app.route("/results")
而不是 app.route("/search")
中调用数据库查询。
如果有人有任何其他想法,请分享。