在 Flask 上解码非 ASCII 字符 request.form
decode non ASCII characters on Flask request.form
我在 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 注入攻击
为了测试这个问题,让我们尝试将 python 中的默认字符编码更改为 unicode,如 here 所述。为此,请将以下行添加到脚本的顶部:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
但是一般来说不鼓励使用这种方法。 this stack overflow question 中有多个更永久的解决方案地址,但 "real" 答案是您应该升级到 python 3,其中默认字符编码已经是 Unicode。
希望对您有所帮助!
我在 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 注入攻击
为了测试这个问题,让我们尝试将 python 中的默认字符编码更改为 unicode,如 here 所述。为此,请将以下行添加到脚本的顶部:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
但是一般来说不鼓励使用这种方法。 this stack overflow question 中有多个更永久的解决方案地址,但 "real" 答案是您应该升级到 python 3,其中默认字符编码已经是 Unicode。
希望对您有所帮助!