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()関数が処理されます。