雑食性雑感雑記

知識の整理場。ため込んだ知識をブログ記事として再構築します。

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 )

    # 後処理。省略。

  • やはり日本語の処理は面倒だ。
    • だからと言って、英語ができるわけでは無いが。。