python - 解码 Flask request.form 上的非 ASCII 字符

标签 python html flask http-post ascii

我在 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 注入(inject)攻击

为了测试这个问题,让我们尝试将 python 中的默认字符编码更改为 unicode,如here所述。 。为此,将以下行添加到脚本顶部:

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

但是,一般情况下不鼓励使用此方法。有多个更永久的解决方案地址在this stack overflow question但“真正”的答案是你应该升级到 python 3,其中默认字符编码已经是 Unicode。

希望这有帮助!

关于python - 解码 Flask request.form 上的非 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507334/

相关文章:

python将列表写入文本文件导致长度不同

python - Flask - Gunicorn 在 curl 到同一实例上的本地主机后返回 404

python - Flask无法获取远程客户端的真实IP

python - Flask 蓝图在蓝图中而不是根目录中查找静态文件

python - 使用脚本参数在 Snakemake 中指定 Python 版本

python - 如何在 Spyder IPython 控制台中从 sympy 获得 Latex 风格的输出?

python - boto3 中 efs 的自定义等待条件

javascript - Video.js - 使其能够响应不同尺寸

html - 在 Angular 中上传文件之前预览多张图片

javascript - 带圆 Angular 的 jCarouselLite 容器