DjangoがPython3で使えるようになったらしいので試してみた その1

Django

Python2時代からお世話になってるWebフレームワークですが、Python3が登場してからしばらくPython2にしか対応してませんでした。なんとかソースコード改変してPython3に無理やり対応・・・なんてこともしましたが、ようやく公式で対応したようです。

データベースのプラグインもpython2じゃないと動かないものも多くて、ほんとに苦労しました・・・。

というわけで、久々にPython3でDjangoをやってみたわけですが、これが実におもしろいw
RubyOnRailsはDevサーバーの起動がちょっと重くて開発時にちょっともたつく・・(本番は早い)けどもPythonだとさっくさく!
高速開発するならやっぱりpythonなんじゃないでしょうか、githubで公開されているようなOSSパッケージに頼らなくてもコーディングできる自身があるなら、Pythonという選択もいいかもしれません。特にデザイナーがデザインして卸すようなものだったらDjangoお勧めです。

ってことで、この記事では特にDjangoについて新しい機能を紹介するというわけではなく単純にほそぼそとDjangoのチュートリアルをやってみることにします。デバッグ系コマンドとかは、やっぱり触ってみないとわからないですしおすし。

Python3とDjangoのインストール

Pythonは pyenvかwindowsのパッケージ経由からインストールしてください、 Djangoは普通に公開されているものをpython install setup.py します。

最後に、
https://docs.djangoproject.com/en/1.6/intro/install/ の「Verifying」の項目を見てDjangoがインストールされたか調べます。

プロジェクトの作成

このあたりの話は全部
https://docs.djangoproject.com/en/1.6/intro/tutorial01/
ここに書かれています。 pyenvを使っている人は pyenv rehash すると、”django-admin.py” というコマンドが使えるようになっていると思います。

django-admin.py startproject mysite

これでプロジェクトを作成します。なんだか、一つのプロジェクトに複数のサイトがある構図・・らしいです。
このあたり混乱しました。

devサーバーの起動

devサーバーを起動するには、こうします。

python manage.py runserver

ポートを変えたい場合はこんなかんじ

python manage.py runserver 8080

自分のパソコンだけではなく、他のパソコンからもアクセスできるようにしたい場合は

python manage.py runserver 0.0.0.0:8000

このようにします。

データベースの設定

データベースはデフォルトでsqlite3が使用されるようになっています。
あとで変更することもできるのでここは一旦保留にして次に進みます。。。

データベースシンク

python manage.py syncdb

アプリの作成

プロジェクトの中にアプリを作成します。 appがアプリの名前です。

python manage.py startapp app

アプリを作成したら、設定ファイルにアプリを登録します。

vim mysite/settings.py
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app'
)

モデルファイル編集と構築

vim app/models.py
from django.db import models
class Poll(models.Model): question = models.CharField(max_length=200) pub_date = models.DateTimeField('date published')
class Choice(models.Model): poll = models.ForeignKey(Poll) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)

公式からのそのまんまコピペです。細かいことは気にせずとりあえずコピペでいいと思います。多分。

そして、dbを構築します。

python manage.py sql app

appがアプリ名です。これでdbを構築できます。設定ファイルのINSTALLED_APPSにアプリ名を追記してないと実行できないらしいので注意。それでもエラーを吐く場合は、何度か実行すればうまくいきます。(謎ですが・・。)

そして最後にもう一度syncdb

python manage.py syncdb

モデルをいじってみる

もうモデルはできてるので、実はもう弄ることができるようになってます。
弄るには、

python manage.py shell

で対話シェルに入ります。対話シェル大好きです。

対話シェルに入ったら、何もパッケージをロードしている状態ではないので、パッケージをロードしつつ、モデルメソッドを実行していく・・・という流れになります。

# PollモデルとChoiceモデルをロード
from app.models import Poll, Choice
# Pollが持っているモデルを全て取得
Poll.objects.all()
# => []
# timezone取得するパッケージ
from django.utils import timezone
# PollモデルクラスからPollモデルを作る
p = Poll(question="What's new?", pub_date=timezone.now())
# モデルの保存(↑で作成しているように見えるけども実は保存されていないらしい)
p.save()
# モデルのIDを見てみる
p.id
# => 1
# モデルのカラムを見てみる
p.question
# => "What's new?"
# モデルのカラムを見てみる
p.pub_date
# => datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# モデル書き換えてみる (p.save で保存される)
p.question = "What's up?"
p.save()
# モデル一覧見てみる
Poll.objects.all()
=> Poll.objects.all()

おー、便利、ある程度遊ぶだけでモデルの扱いに慣れそうですね。他にもいろんなメソッドありそうなのでいじってみるといいとおもいます。

とりあえずこの記事ではここまでにしておきます。
いちいちApacheを用意しなくても開発でお試しでやるならdevサーバーが便利ですね。
次回は、ルーティング周りをやれたらやります。

Pythonでエスケープとアンエスケープを行う

Escape Unescape

s = unicode(raw_input(), "utf-8").encode('unicode_escape')
print s
print s.decode('unicode_escape')

これでいけた。Python3からは文字コード周りがすごい修正かかってるらしいんだけども、これがあれば問題ない気がする。raw_inputのところをリテラルに変えてもいいし、エラーも吐かずいい仕事してくれる。

ただ改行コードが・・

しかし改行コードまではエスケープしてくれない。しかも先頭の\が消えるときがある。

追記

import cgi
cgi.escape("ほげほげ");

こんなのもあった。

PythonでMeCab実行時に文字化けを治す

文字化けの原因

文字化けの原因はどうやら一緒にインストールした辞書が原因らしい。UTF-8としてmakeしたはずなのになぜかeuc-8になってしまうらしく。これもまた混乱の原因になってしまうようです。

辞書の変更

sudo update-alternatives –config mecab-dictionary

とすることで辞書を変更できるようですが、これでutf-8を指定してるのにも関わらず文字化けする始末。どうしてなんだろうと調べてみると原因は全く関係ないところにありました。

mecabrcファイルを探す

find / -name *mecabrc*

mecabrcファイルにdecDirというディクショナリのディレクトリを指定する変数があるのでこれをutf-8対応のものに書き換えます。ややこしい・・。

/usr/local/etc/mecabrc
/etc/mecabrc

自分の環境だと2つでてきたのでこれらをviで開いてdecdirを書き換え。
書き換える元の辞書のファイルパスがわからない場合は、

find / -name *ipadic-utf8*

で探します。

/var/lib/mecab/dic/ipadic-utf8

こんなかんじになってるのがだいたい正解です。