如何在Flask中获取HTML下拉菜单值以实现动态翻译目标语言?
解决你的下拉菜单目标语言传递问题
看起来你遇到了两个核心问题,导致无法正确获取用户选择的目标语言:
1. 错误使用GET参数方式获取POST表单值
你的表单明确用POST方法提交,但代码里却用request.args['lang_target']来拿参数——request.args是专门读取URL里的GET查询参数的,POST表单的参数都存在request.form对象里。
另外,直接用方括号硬取参数如果用户没选语言会抛出KeyError,建议用.get()方法更安全,还能设置默认值兜底:
# 替换原来的target赋值行 target = request.form.get('lang_target', 'en') # 第二个参数是默认语言,比如默认英文
如果要严格校验用户必须选择语言,可以加个判断:
target = request.form.get('lang_target') if not target: flash("请选择目标语言") return redirect(url_for('selectImage'))
2. HTML下拉菜单的选项值设置错误
你的HTML里所有<option>的value都固定写死成了1,这意味着不管用户选哪个语言,提交的都是1,完全不是你需要的语言代码(比如fr、es这类)。你应该把value设置为循环里的语言代码x:
<select name="lang_target"> {% for code, name in language_target.items() %} <option value="{{ code }}"> {{ name }}</option> {% endfor %} </select>
这里我把循环改成了.items(),直接同时拿到语言代码和名称,比原来通过键取值的写法更清晰直观。
修改后的关键代码片段
Python部分(getfileHelper函数)
@app.route('/getfileHelper', methods=['GET','POST']) def getfileHelper(): if request.method == 'POST': file = request.files['imgfile'] filename = secure_filename(file.filename) if file.filename == '': flash("No file selected. Please select an image file") return render_template('selectImage.html') texts = detect_text('static/images/'+filename) text_translations = [] # 正确获取POST表单中的目标语言 target = request.form.get('lang_target') if not target: flash("Please select a target language") return redirect(url_for('selectImage')) for text in texts: translate_client = translate.Client() translate_text = text.description source = 'en' # 使用获取到的target参数调用翻译API translation = translate_client.translate(translate_text, source_language=source, target_language=target) text_translations.append({'text':translate_text, 'translation':translation['translatedText']}) db_append(filename, translate_text, translation['translatedText']) return render_template('home.html', filename=filename, text_translations=text_translations)
HTML部分(下拉菜单)
<select name="lang_target"> {% for code, name in language_target.items() %} <option value="{{ code }}"> {{ name }}</option> {% endfor %} </select>
这样修改后,就能正确获取用户选择的目标语言并传入翻译API了。
内容的提问来源于stack exchange,提问作者Aiden Richards
相关产品推荐
相关产品推荐

