2016-04-08 3 views
1

が含まれていますのRequest.Formは、私は私のHTMLからフォームデータのASCII文字を持っていると私のFlaskAppが文字を処理するとき、それは私にこのようなエラーが発生しますASCII文字に

  • UnicodeEncodeErrorを:「ASCII」コーデックことができます序数が範囲内にない(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で何かが見つからないことがありますが、少し失われます。

誰かに手を差し伸べることはできますか?

TSM :)!

+0

あなたのエラーは実際に '__titulo'と' __aviso'の値を設定した行から来ていることをトレースバックから示していますか? cur.execute()から来る可能性が高いと思われます。また、フォームからのデータを使用してSQLクエリを実行するときは注意が必要です。悪意のあるユーザーによる潜在的なSQLインジェクション攻撃を防ぐために、そのデータをエスケープする必要があります。 –

+0

ニースのヒント@タイラー、ありがとう。私はSQLインジェクションの可能性について考えなかった。これを改善するだろう。ありがとうございました! Tracebackについて..これは、HTMLフォームに文字Ñが含まれているときに実際に生成されます。私はデフォルトでASCIIエンコーディングを使用するPython 2.7.6を使用しています。明らかに、ÑはASCIIテーブルによって認識される文字ではありません。私はこの状況を経験したことはないと認めなければなりません。 – ivanleoncz

+0

あなたは大歓迎です、少しupvoteの愛を忘れないでください;)エンコーディングについては、私はこれが一般的なPythonの問題ではないと思います。私はあなたのパッケージで使用しているパッケージスクリプト。 Pythonはユニコードでうまくいっていますが、これを一撃してください。あなたのスクリプトの一番上に、 'import sys'、' reload(sys) '、そして最後に' sys.setdefaultencoding( 'utf-8') '(これはhttp://geekforbrains.com/post/setting-the -default-encoding-in-python)の投稿を参照してください。それが動作しない場合、私は別の理論を持っています... –

答えて

1

__titulo__avisoの値を設定した行から実際にエラーが発生していることがトレースバックによって示されていますか。そのcur.execute()からの可能性が高いと思われる。また、フォームからのデータを使用してSQLクエリを実行するときは注意が必要です。このデータをエスケープして、悪意のあるユーザーからのSQLインジェクション攻撃を防止してください。

この問題をテストするには、hereのように、Pythonのデフォルト文字エンコードをユニコードに変更してみましょう。これを行うには、スクリプトの先頭に次の行を追加します。

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

しかし、一般的にこの方法の使用はお勧めしません。 this stack overflow questionに複数の恒久的な解決策がありますが、 "本当の"答えは、デフォルトの文字エンコーディングが既にUnicodeであるPython 3にアップグレードする必要があるということです。

希望すると便利です。

+0

ありがとう@タイラー;)!出来た! – ivanleoncz

関連する問題