2016-04-08 63 views
1

我从我的HTML表单数据有一个ASCII字符,当我FlaskApp处理的字符,它给了我这样的错误:的request.form包含ASCII字符

  • UnicodeEncodeError:“ASCII”编解码器“T编码字符U” \ XF1' 在位置2:顺序不在范围内(128)

相信我必须改变我的应用程序的东西,例如,对请求进行解码的形式,但我不能t找到一个方法来做到这一点。

这里是代码:

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中可能丢失了某些东西,但我有点失落。

难道你们中的任何一个人都能帮我一把吗?

TSM :)!

+0

追溯表明你的错误实际上来自你设置'__titulo'和'__aviso'值的行吗?似乎更可能来自'cur.execute()'。在使用表单中的数据执行SQL查询时,您还需要小心。您应该转义该数据以防止来自恶意用户的任何潜在SQL注入攻击。 –

+0

不错的提示@TylerS,非常感谢。我没有想过SQL注入的可能性。我会改进这一点。谢谢!关于Traceback ..当html表单包含字符Ñ时,它真的会产生。我使用Python 2.7.6,默认情况下使用ASCII编码。显然,Ñ不是ASCII表格所能识别的字符。我不得不承认我从来没有经历过这种情况.. – ivanleoncz

+0

不客气,不要忘记给点小情愿爱;)关于编码,我不认为这是一个普通的python问题,我认为它与你使用的一个软件包有关脚本。 Python与unicode很好玩,但请注意这一点。在脚本的顶部:'import sys'然后'reload(sys)',最后是'sys.setdefaultencoding('utf-8')'per [this](http://geekforbrains.com/post/setting-the -default-encoding-in-python)后。如果它不起作用,我有另一种理论... –

回答

1

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

要测试此问题,让我们试着将0123在Python中的默认字符编码更改为unicode,如here所述。为此,将以下行添加到脚本的顶部:

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

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

希望这会有所帮助!

+0

谢谢@TylerS;)!有效! – ivanleoncz

相关问题