Django で日本語パラメータを POST する
概要
- Django を利用した Webアプリを作った際、日本語を POST した。
- Django 側が受け取った時、文字列は unicode になっている。それを含めた decode 処理をする必要あり。
環境
- システム全体を通しての文字コードは utf-8 。
- Backend ( WebAPI ) は Django 1.6 で作成。
- Frontend は Django を使わず、純粋な HTML + Javascript で作成。
- ライブラリに jQuery 1.10 を使用。
該当機能
- Frontend 側で、ユーザが日本語のコメントを入力し、それを backend 側で保存する。
- あとで frontend の別画面に表示。
Frontend 側実装 ( Javascript )
- 日本語を POST する処理。
- jQuery の「$.ajax」を使用。エラー時のコールバックも ( 一応 ) 欲しいので。
- 日本語は「encodeURIComponent( ... )」で encode する必要あり。
- 以下、サンプル。
- 「$.ajax」は ( 自分が ) 使い易いようにラップ。「_ajax」。
- 実際に実行するのは、「postMessage」。
var _webapi_post_message = '<webapi url>'; /* * メッセージを投稿します。 * @param message : 投稿メッセージ * @param success : 処理成功時に実行する関数 * @param failure : 処理失敗時に実行する関数 */ var postMessage = function( message, success, failure ) { var data = {}; data.message = encodeURIComponent( message ); _ajax( _webapi_post_message, 'POST', data, success, failure ); }; /* * jQuery による ajax 通信メソッドのラッパー * @param url : 送信先の URL * @param method : 使用 METHOD。GET or POST * @param send_data : 送信データ。hash 型 * @param success : 成功時に実行される関数 * @param failure : 失敗時に実行される関数 */ var _ajax = function( url, method, send_data, success, failure ) { $.ajax( { url : url, type : method, data : send_data, cache : false, dataType : 'json', success : function( data, dataType ) { if ( success != null ) { success( data, dataType ); } }, error : function( XMLHttpRequest, textStatus, errorThrown ) { if ( failure != null ) { failure( XMLHttpRequest, textStatus, errorThrown ); } } } ); };
Backend 側実装 ( Python ( Django ) )
- 受け取ったパラメータは encode されているので、それを decode する。
- ただし、受け取った文字列は unicode なので、一度 utf-8 に変換して decode 。
- 引き続き Python で処理するため、decode したら再び unicode に戻す。
- 以下、サンプル。views.py。
- 「postMessage」が Frontend からのデータを受け付けて処理。
- 「__unquote」で、文字列の変換処理をしている。
# 諸々、前略 import urllib2 def __unquote( message ) : ''' ( encodeURIComponent された ) 入力 message を unquote して返します。 @param message : 入力メッセージ。unicode 文字列。 @return : unquote したメッセージ。unicode 文字列。 ''' _message = message.encode( 'utf-8', 'ignore' ) # unicode => utf-8 _message = urllib2.unquote( _message ) # decode _message = _message.decode( 'utf-8' ) # utf-8 => unicode return _message def postMessage( request ) : ''' 投稿されたメッセージを処理します。 @param : request @return : HttpResponse ''' # 前処理。省略。 # メッセージ取得 message = request.POST.get( 'message', '' ) # 変換 message = __unquote( message ) # 後処理。省略。
- やはり日本語の処理は面倒だ。
- だからと言って、英語ができるわけでは無いが。。