DjangoでShift-JISの携帯サイトを作る

Djangoのバージョンは1.0.2を使っています。
まず、settings.pyでDEFAULT_CHARSETをcp932に指定しておきます。
ここでShift_JISを指定してしまうと「〜」などの文字を出力しようとした時にUnicodeErrorが出てしまいます。

DEFAULT_CHARSET = 'cp932'

このままだとレスポンスのHTTPヘッダが Content-Type: text/html; charset=cp932 となってしまい良くないのでContent-TypeをShift_JISに付け替えます。middleware.pyを作ってその中でMiddlewareクラスを定義しておきます。

class SJISMiddleware(object):
  def process_response(self, request, response):
    response['Content-Type'] = 'text/html; charset=Shift_JIS'
    return response

特定のファイルはContent-Typeを変えたくない場合はif文で振り分けるなどすると良いでしょう。Content-Typeがtext/htmlの場合だけ付け替えるというのも良いかもしれません。


さらにContent-Lengthも付与するようにMiddlewareクラスを作っておくと良いと思います。

class ContentLengthMiddleware(object):
  def process_response(self, request, response):
    if not response.has_header('Content-Length') and response.content:
      response['Content-Length'] = len(response.content)
    return response

あと機種判別のため uamobile も使うケースが多いと思います。とても素晴らしいパッケージですね。

class UserAgentMobileMiddleware(object):
  def process_request(self, request):
    request.device = None
    try:
      request.device = detect(request.META)
    except Exception, e:
      print "Can't detect device: %s" % e

最後に上で作った3つのMiddlewareをsettings.pyで有効にします。こんな感じでしょうか。

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'some.project.middleware.ContentLengthMiddleware',
    'some.project.middleware.SJISMiddleware',
    'some.project.middleware.UserAgentMobileMiddleware',
)

some.projectの部分はmiddleware.pyの配置箇所によって適宜置き換えてください。

ちなみにMIDDLEWARE_CLASSESで指定したクラス群は、リクエストの時は上から順にprocess_request()関数が処理され、レスポンスの時は下から順にprocess_response()関数が処理されます。