【发布时间】:2020-05-06 21:08:20
【问题描述】:
所以我正在使用 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 个字符的单词时,该应用程序运行良好。
【问题讨论】:
-
您是否使用调试器或
print()语句验证过您的假设是否正确? -
换一种说法:如果这是
WTForms的问题,我会确实非常惊讶,因为它没有这样的限制。它也很高兴地接受了单个字符字。 -
如何使用调试器进行验证?这是我的第一个项目
-
取决于你的开发环境是什么样的。如果您在终端中使用
flask run,您可以使用print()打印值(print("Search is set to:", repr(form.search.data))),这些值将在访问路由时出现在您的终端中。 -
我已经打包了我的应用程序,并且正在从 windows cmd 运行 run.py 如果你告诉我如何或者如果你将我链接到某个我可以阅读调试过程的地方,我可以检查它的值
标签: python python-3.x flask flask-wtforms