Database JUNKY

MySQL,MariaDBを中心としたブログです

python3 のrequest.args.getでUnicodeEncodeErrorが出た時の対処方法

ここで書いていることって、現役エンジニアの人にしてみればちゃんちゃらおかしい話なんだろうな、なんてことをいつも思いつつも、今日もメモします。

python3でのgetでこんなエラーが出てしまいハマりました。

問題のgetはこちら

word = request.args.get('word')

とにかく、日本語が通らないのでなんだこりゃって感じで苦戦すること2時間。。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 12-13: ordinal not in range(128)

とか

AttributeError: 'str' object has no attribute 'decode'

とかです。日本語がなんかダメなんですよね。。。というところまではわかったのですが、これの対策の苦戦した話のメモになります

f:id:hit10231023:20180302202040p:plain

対策

文字コードうんぬん周りなんだろーなってのは憶測がついたので、じゃあ、utf-8にすれば問題なくなるんだよね?とか、これで再度試してみたところ。。

 word = request.args.get('word').decode('utf-8')
----------------------
AttributeError: 'str' object has no attribute 'decode'

・・もう何がなんだか汗

asciiとして認識されるは、utf-8とすると、こんなエラーになるわでほとほと疲れてきたところで以下を試したところ。。

うごいたw

    word = urllib.parse.quote(request.args.get('word'))
    url = 'http://test-domain.local:5000/search/' + word
    res = urllib.request.urlopen(url)

詳しくはあとで調べるとして(きっと調べない)、get変数とかは必ず、urllib.parse.quoteで文字エンコードかけたほうがいいよおおって話でした。 urllib自体は、python3に標準実装されているはずなので、利用時は、import句で

import urllib.parse

を指定すれば、利用できると思います