Pages

Tuesday, July 2, 2013

DjagngoでDBマイグレーションSouthの使いかた

DBマイグレーションSouthのホームページはここ
Southのドキュメントはここ


さあ、まずはインストール
pip install south

そして、settings.pyのINSTALLED_APPSに以下を追加
'south'

私の場合はすでにプロダクション環境があり、そこでSouthを使いたいので、
ここのページに有るように以下を実行

python manage.py syncdb
python manage.py convert_to_south (app name)


python manage.py schemamigration (app name) --auto

 python manage.py migrate (app name)

これだけで、新しくmodels.pyに追加や変更したフィールドがDBに反映されるのは本当に素晴らしいですね。
今後また更にSouthを掘り下げて取り上げたいと思います。



Saturday, June 15, 2013

Djangoのsyncdbで発行されるSQLを見る

最近は、自分の立てたサービスの改善に注力している。

一度サービスインさせると、環境を壊して作りなおすというようなことができないので、SQLのアップデートを掛ける必要が頻発して来ました。

テーブルの構造を修正する上で、Djangoが生成するSQLを見るのは非常に約にたちます。
この方法はDjango本家のチュートリアルでも書かれていますが、覚書程度に書いておこうと思います。

addressというアプリがあった場合、その、model.pyをいじった後に、以下のコマンドを実行
python manage.py sql address

これで、発行されるSQLが見れるはずです。


Thursday, June 6, 2013

Python, Djangoでウェブサービスを作ってみた!

ウェブサービスの作成は簡単なものでもとても根気が入りますね。

なんとかPython, Djangoを用いてサービスを作成し、公開することができました。


サイトの名前は”まぐろく


名前の由来はマガジン(雑誌)と付録を融合させた造語です。

最近はやはり紙媒体の目玉は付録ですよね。
かつ、その付録や雑誌について自由に語り合える場を提供出来ればと思って、”まぐろく”をリリースしました。

是非皆さんもこのサイトをご覧になってみてください。
雑誌と付録のコミュニティサイト”まぐろく”

よろしくお願いします。

これから、サイトのアクセスを伸ばすためにまた苦労を重ねていこうと思っています。
このブログでも更にDjangoで用いた機能、ウェブサービス運営のノウハウを提供出来ればと思っています。

Monday, May 20, 2013

Python: for ループのカウンター

一般的なfor ループは以下のように記述する。
for i in items:
  print i
で、よくあるのはforループの中で今何回目の処理なのかを知りたくって、カウンターを取ってくる事。

何も考えずにするとこんな感じだろうか。
counter = 0
for i in items:
  print i
  counter +=1
  print counter
 でも、Pythonではもっとエレガントにできる。そのためにはenumerateを使う
for (counter, i) in enumerate(items):
  print i
  print counter

Sunday, May 12, 2013

Tuesday, May 7, 2013

Djangoを1.5.1にアップグレードして、そして、空のプロジェクトを作成し開発サーバーを走らせたらいきなりエラーに遭遇してしまった。
結構Stackoverflowでも質問されているエラーでした。

エラーの詳細を説明すると以下のコマンドを空のプロジェクト作成後に実行。
python manage.py runserver

すると、以下のエラーが出て来ました。

Validating models...
Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x106e41210>>
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/django/core/management/commands/runserver.py", line 92, in inner_run
    self.validate(display_num_errors=True)
  File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 280, in validate
    num_errors = get_validation_errors(s, app)
  File "/Library/Python/2.7/site-packages/django/core/management/validation.py", line 35, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/Library/Python/2.7/site-packages/django/db/models/loading.py", line 166, in get_app_errors
    self._populate()
  File "/Library/Python/2.7/site-packages/django/db/models/loading.py", line 72, in _populate
    self.load_app(app_name, True)
  File "/Library/Python/2.7/site-packages/django/db/models/loading.py", line 96, in load_app
    models = import_module('.models', app_name)
  File "/Library/Python/2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Library/Python/2.7/site-packages/django/contrib/auth/models.py", line 370, in <module>
    class AbstractUser(AbstractBaseUser, PermissionsMixin):
  File "/Library/Python/2.7/site-packages/django/db/models/base.py", line 213, in __new__
    new_class.add_to_class(field.name, copy.deepcopy(field))
  File "/Library/Python/2.7/site-packages/django/db/models/base.py", line 265, in add_to_class
    value.contribute_to_class(cls, name)
  File "/Library/Python/2.7/site-packages/django/db/models/fields/__init__.py", line 257, in contribute_to_class
    cls._meta.add_field(self)
  File "/Library/Python/2.7/site-packages/django/db/models/options.py", line 179, in add_field
    self.local_fields.insert(bisect(self.local_fields, field), field)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", line 56, in <lambda>
    '__lt__': [('__gt__', lambda self, other: other < self),
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", line 56, in <lambda>
    '__lt__': [('__gt__', lambda self, other: other < self),
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", line 56, in <lambda>
    '__lt__': [('__gt__', lambda self, other: other < self),
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", line 56, in <lambda>
    '__lt__': [('__gt__', lambda self, other: other < self),
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", line 56, in <lambda>
    '__lt__': [('__gt__', lambda self, other: other < self),
RuntimeError: maximum recursion depth exceeded in cmp

結局Djangoをアンインストールして、再インストールするとエラーはなくなりました(泣)
sudo pip uninstall django
sudo pip install django

StackOverflowの答えのページにも書いたのですが、 このアンインストール、再インストールそして、python manage.py runserverをエラーがでた同じターミナルで行うと、実はエラーが解消されていてもエラーが出続けますので、新しいターミナルをたちあげてpython manage.py runserverコマンドをもう一度試して見ることをおすすめします。

ちなみに、StackOverflowのページを見て気づかれたかもしれないですが、英語圏ではCodingDaddyとして活動しております。よろしくお願いします。

Monday, May 6, 2013

SEO対策(パート1)URLをサーチエンジンに登録する

検索で自分のページが引っかかるようにする第一のステップは検索エンジンに自分のURLを登録することです。
Googleはよく徘徊しているので、多分提出しなくても、検索エンジンのディレクトリに登録されているかもしれませんね。

有名所で考えるとGoogle, Yahoo, Bingといったところでしょうか。
以下のページでURLを登録することができます。

GoogleにURLを提出する

YahooにURLを提出する
一応ページは存在するのですが、結局Bingのページに連れて行かれました。w
もしや検索エンジン同じなんてないですよね?299ドル払って有料のYahooDirectoryには登録できるみたいですが…

BingにURLを提出する

さあ、この次はウェブマスターツールについて考えましょう。

Djangoを1.5にアップグレードする。

現在のDjangoの最新バージョンは1.5.x

今のローカルマシンには1.4.xが入っている。

Djangoをアップグレードするには,インストールと同じ手順で--upgradeオプションを付けるのみ。

sudo pip install Django --upgrade

以下の様な結果が出てくるはず。


Downloading/unpacking Django from https://pypi.python.org/packages/source/D/Django/Django-1.5.1.tar.gz#md5=7465f6383264ba167a9a031d6b058bff
  Downloading Django-1.5.1.tar.gz (8.0MB): 8.0MB downloaded
  Running setup.py egg_info for package Django
 
    warning: no previously-included files matching '__pycache__' found under directory '*'
    warning: no previously-included files matching '*.py[co]' found under directory '*'
Installing collected packages: Django
  Found existing installation: Django 1.4.2
    Uninstalling Django:
      Successfully uninstalled Django
  Running setup.py install for Django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755
 
    warning: no previously-included files matching '__pycache__' found under directory '*'
    warning: no previously-included files matching '*.py[co]' found under directory '*'
    changing mode of /usr/local/bin/django-admin.py to 755
 
 
    ========
    WARNING!
    ========
 
    You have just installed Django over top of an existing
    installation, without removing it first. Because of this,
    your install may now include extraneous files from a
    previous version that have since been removed from
    Django. This is known to cause a variety of problems. You
    should manually remove the
 
    /Library/Python/2.7/site-packages/django
 
    directory and re-install Django.
 
Successfully installed Django
Cleaning up...


そして、以下のコマンドでアップグレードされたバージョンをチェックできる。
>>> import django
>>> quit()

Friday, May 3, 2013

sudo: pip: command not found エラー Mac OS X

Djangoをマックでインストールしようと思って以下のコマンドを打てみた。
sudo pip install Django

だが、以下の様な結果が帰ってきた。
sudo: pip: command not found

その場合は、pipコマンドをeasy_installを使ってインストールする必要がある。

sudo easy_install pip

多分以下の様な結果が帰ってくるはず。

Searching for pip
Reading http://pypi.python.org/simple/pip/
Reading http://www.pip-installer.org
Reading http://pip.openplans.org
Best match: pip 1.3.1
Downloading http://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#md5=cbb27a191cebc58997c4da8513863153
Processing pip-1.3.1.tar.gz
Writing /tmp/easy_install-PqMIO5/pip-1.3.1/setup.cfg
Running pip-1.3.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-PqMIO5/pip-1.3.1/egg-dist-tmp-YmSgST
warning: no files found matching '*.html' under directory 'docs'
warning: no previously-included files matching '*.txt' found under directory 'docs/_build'
no previously-included directories found matching 'docs/_build/_sources'
Adding pip 1.3.1 to easy-install.pth file
Installing pip script to /usr/local/bin
Installing pip-2.7 script to /usr/local/bin
Installed /Library/Python/2.7/site-packages/pip-1.3.1-py2.7.egg
Processing dependencies for pip
Finished processing dependencies for pip

Requirement already satisfied (use --upgrade to upgrade): Django in /Library/Python/2.7/site-packages
Cleaning up...

MacでPythonとMySQL関連のエラーの対処法

以下のようなエラーに出くわしたことがあるだろうか?
これは、Mac上でMySLQLとPythonを連携させようとするとたまに以下のようなエラーにである方がいるみたい。
ちなみに、私もその内の一人です。DjangoとMySQLまでは連携させられたのに、Sphinxを使った途端に、ドキュメントの作成がうまく行かなくなりました。


"Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/_mysql.so
  Reason: image not found", please check your spelling and sys.path

Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/_mysql.so
  Reason: image not found", please check your spelling and sys.path

とりあえずエラーを見るとlibmysqlclient.18.dylibが問題になっていることがわかる。
なので、まずそのファイルを探してみます。
locate libmysqlclient.18.dylib

すると以下の様な結果が帰って来ました。
/usr/local/mysql/lib/libmysqlclient.18.dylib

どうやら、これはLinux系とMacの違いなのではないかと思うのですが、
/usr/libから参照できるようになっているべきなようです。

なので、以下の様なソフトリンクを作成

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

これで、見事にエラーは消えました。

参考
http://stackoverflow.com/questions/6383310/python-mysqldb-library-not-loaded-libmysqlclient-18-dylib