2016-04-08 110 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

相關問題