Flask+MySQL开发词典提交搜索返回500错误该如何解决
错误原因
- 表单提交路径不匹配:HTML表单未指定
action属性,提交时默认请求当前页面也就是/路由,但/路由对应的search函数只处理了GET请求,没有对POST请求做任何处理、也没有返回响应,这是报错的直接原因。 - 路由逻辑未触发:你编写了
/word路由的POST处理逻辑,但表单没有提交到这个地址,导致对应逻辑完全没有被调用。 - 其他潜在问题:
- SQL语法错误:
SELECT English_Translation * FROM wordentry2语法不合法,不能同时指定单个字段和*全量通配符 - 存在SQL注入风险:直接拼接用户输入到SQL语句中,极易被恶意注入攻击
- 未处理空查询结果:如果搜索没有匹配结果,直接取
output[0]会引发索引越界错误 - 游标返回格式不匹配:默认MySQL游标返回元组类型,你按字典格式取值
output[0]['urdu_word']会报错,需要指定字典游标
- SQL语法错误:
解决方案
- 修正表单提交路径,给HTML的form标签添加action属性,指定提交到
/word路由:
<form method="POST" action="/word">
- 修正
/word路由的逻辑,补全边界处理:
# 根据你使用的MySQL连接库导入对应字典游标,以下为flask-mysqldb的示例 import MySQLdb.cursors @app.route('/word',methods = ['POST','GET']) def word(): # 处理GET请求,直接跳回首页避免直接访问报错 if request.method == 'GET': return redirect('/') if request.method=='POST': input1 = request.form['input1'] # 初始化字典游标,支持按字段名取值 cur = mysql.connection.cursor(MySQLdb.cursors.DictCursor) # 修正SQL语法,使用参数化查询避免注入风险 cur.execute('''SELECT urdu_word, English_Translation FROM wordentry2 WHERE English_Translation LIKE %s''', (f'%{input1}%',)) output = cur.fetchall() # 处理无匹配结果的场景 if not output: return render_template('word.html', error="未找到匹配的词汇") return render_template ('word.html', urduword = output[0]['urdu_word'], englishword = output[0]['English_Translation'])
内容的提问来源于stack exchange,提问作者Ahmad Dada
相关产品推荐
相关产品推荐

