在Flask request.form上解码非ASCII字符

问题描述 投票:1回答:1

我在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中缺少某些内容,但我却有些失落。

有什么想法吗?

python html flask http-post ascii
1个回答
2
投票

回溯是否表明您的错误实际上来自设置__titulo__aviso的值的行?似乎更有可能来自cur.execute()。此外,在对来自表单的数据执行SQL查询时,还需要小心。您应该转义该数据,以防止恶意用户进行任何潜在的SQL注入攻击]

为了测试此问题,让我们尝试按照here的说明将python中的默认字符编码更改为unicode。为此,请在脚本顶部添加以下几行:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

但是通常不建议使用此方法。 this stack overflow question中有多个其他永久解决方案地址,但“真实的”答案是您应该升级到python 3,默认字符编码已经是Unicode。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.