2013年10月28日月曜日

[Django] 開発と本番環境で同じ設定ファイルを使いまわす

Djangoの設定ファイルであるsettings.pyが開発用と本番用の2種類あったりすると、管理が面倒だし、うっかり上書きとかもありえますよね。
面倒なものは1つにまとめましょう。

例えば、開発と本番で静的ファイルの場所やURLが異なる場合は、

settings.pyの真ん中辺
# 本番環境の Static file のルートディレクトリ
STATIC_ROOT = '/path/to/production/dir/'

# 本番環境の Static file の URL
STATIC_URL = 'http://static.example.com/'

settings.pyの一番下のあたりで設定を上書き
# 開発環境の Static file のディレクトリ,URL
import socket
if socket.gethostname() == '開発マシン名':
    STATIC_ROOT = '/path/to/development/dir/'
    STATIC_URL = '/static/'

ここで、'開発マシン名'とは、pythonを実行中のマシンのホスト名です。
>>>> import socket
>>>> socket.gethostname()
'開発マシン名'

こうすれば、settings.pyには基本的に本番環境用の設定を書き込んでおいて、最後に開発環境の設定を上書きすれば良いので、分かりやすく、ミスも起きにくくて使いやすいですね。

2013年10月27日日曜日

[Python] 機種依存文字を無視してファイルに出力

ウェブから入力されたデータを、WindowsのExcelで開けるcsvファイルに変換しようとして行き詰まった話。

Google日本語入力なんかを使っていると機種依存文字なんかも候補に出てきてしまいますよね。
それを、UTF-8ならまだしも、shift_jisとかcp932(Windowsの日本語拡張エンコーディング)なんかに変換しようとすると、エラーを吐いて終了するわけです。

UTF-8にエンコードしてファイルに出力
#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('utf-8'))
f.close()

file.txt
機種♫依存✓文字が⊿含まれています
問題なく出力


cp932で出力
#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932'))
f.close()

UnicodeEncodeErrorで終了。
Traceback (most recent call last):
  File "test.py", line 6, in 
    f.write(kishu_izon.encode('cp932'))
UnicodeEncodeError: 'cp932' codec can't encode character u'\u266b' in position 2: illegal multibyte sequence
♫がエンコード出来なかったみたいですね。

こういう時は、エラーを返す文字を無視するか、他の文字(?等)に置き換えて出力すればOK。

encodeの2引数目に'ignore'を指定。
#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932','ignore'))
f.close()

file.txt
機種依存文字が⊿含まれています
変換できなかった文字は無視して出力されます。


encodeの2引数目に'replace'を指定。
#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932','replace'))
f.close()

file.txt
機種?依存?文字が⊿含まれています
変換できなかった文字は?に変換されます。

正直言うと、WindowsのExcelがcsvファイルはshift-jisじゃないと開けないとかいう困ったちゃんなのがいけないのです。

Sample of source code.

Submit source code sample.
import sys

def hello():
    print "hello world."
    sys.exit()
We can use the syntax highlighter easily, thanks to Syntax Highlighter Scripts Generator.