【发布时间】:2016-04-08 19:01:40
【问题描述】:
我在 HTML 表单数据中有一个非 ASCII 字符,当 Flask 处理该字符时,它给了我这样的错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 2: ordinal not in range(128)
我认为我必须对请求表进行解码,但我找不到这样做的方法。
这是我所拥有的:
HTML
<body>
<div id="avisos">
<form action="/opcion/avisos_cadastrar/resultado" method="post"> <br>
<fieldset>
<legend> Aviso </legend>
<center> <h3> Cadastrar </h3> </center>
<br>
Titulo: <input type="text" name="titulo" maxlength="32" autocomplete='off'> </input>
<textarea name="aviso" id="text-area" rows="10" cols="50" maxlength="512" autocomplete='off'> </textarea>
<br>
<input type=submit value="enviar">
<script>
var area = document.getElementById("text-area");
var message = document.getElementById("message");
var maxLength = 512;
var checkLength = function() {
if(area.value.length <= maxLength) {
message.innerHTML = (maxLength - area.value.length) + " caracteres restantes.";
}
}
setInterval(checkLength, 150);
</script>
</fieldset>
</form>
</div>
</body>
FlaskApp
@app.route("/opcion/avisos_cadastrar/resultado", methods = ['POST'])
def avisos_cadastrar_resultado():
__titulo = request.form['titulo']
__aviso = request.form['aviso']
query_insert_aviso = " INSERT INTO tjs_stage.avisos (Titulo, Aviso) VALUES ('{} ', '{} ')" .format(__titulo,__aviso)
cur.execute(query_insert_aviso)
con.commit()
return render_template('resultado.html')
我尝试使用类似的东西..
__titulo = request.form['titulo'].decode("utf-8")
__aviso = request.form['aviso'].decode("utf-8")
...还有...
__titulo = request.form['titulo'].decode("raw_unicode_escape")
__aviso = request.form['aviso'].decode("raw_unicode_escape")
...但是没有用。
也许我的 HTML 或 FlaskApp 中缺少某些东西,但我有点迷失了。
有什么想法吗?
【问题讨论】:
-
回溯是否表明您的错误实际上来自您设置
__titulo和__aviso的值的行?似乎更有可能来自cur.execute()。此外,使用表单中的数据执行 SQL 查询时需要小心。您应该转义该数据以防止来自恶意用户的任何潜在 SQL 注入攻击。 -
很好的提示@TylerS,非常感谢。我没有考虑过 SQL 注入的可能性。我会改进这一点。谢谢!关于 Traceback.. 当 html 表单包含字符 Ñ 时,它确实会生成。我正在使用默认使用 ASCII 编码的 Python 2.7.6。显然,Ñ不是ASCII表识别的字符。。我不得不承认我从来没有遇到过这种情况。。
-
不客气,别忘了点个赞;)关于编码,我认为这不是一般的python问题,我认为它与其中之一有关您在脚本中使用的包。 Python 与 unicode 配合得非常好,但试一试。在脚本的顶部:
import sys,然后是reload(sys),最后是sys.setdefaultencoding('utf-8'),每个 this 帖子。如果它不起作用,我还有另一个理论...... -
好的。问题是有些人已经提到这是一种解决方法,但不是一个好的做法......你能分享你的理论吗?请发表您的初始评论作为答案,然后我可以投票给您的小费;)。
-
您可以为 cmets 和答案投票。在我们找到并解决问题后,我会将其全部编译并发布一个全面的答案。这有助于其他有类似问题的人,并防止他们从大量 cmets 中筛选以找到解决方案。添加
sys.setdefaultencoding()有效吗?如果是这样,我相信我们可以找到更持久的解决方案。
标签: python html flask http-post ascii