[TurboGears] ブログを作成する。その1
趣旨
私は外部からは閲覧できない自宅サーバで、個人的なメモを記録するためのブログを動かしています。現在はtDiaryを利用していますが、以下のような要望が出てきました。
- 1日に複数件の記事を記録したい。
- はてなと同様の記法をしたい。
- コメントやトラックバックはいらない。
本来ならtDiaryのプラグインを作成するというのが真っ当なやり方なのでしょうが、TurboGearsの練習をしたいこともあり、TurboGearsを使ってゼロから作成することにしました。
なお、同様の企画が、id:aodag:20060518:1147968387とid:mitszo:20061022:1161529859にもあります。
名前
TurboGearsで作る日記システムということで、このブログの名前はtgdiaryにします。
quickstart
TurboGearsは、tg-admin quickstartコマンドで空のプロジェクトを自動生成することができます。このとき、--identityオプションをつけると、ユーザ認証のための仕組みをつけることができます。
$ tg-admin quickstart --identity tgdiary Enter package name [tgdiary]: Selected and implied templates: TurboGears#tgbase tg base template TurboGears#turbogears web framework Variables: egg: tgdiary identity: sqlobject package: tgdiary project: tgdiary sqlalchemy: False Creating template tgbase Creating directory ./tgdiary Recursing into +einame+.egg-info Creating ./tgdiary/tgdiary.egg-info/ Copying PKG-INFO to ./tgdiary/tgdiary.egg-info/PKG-INFO Copying paster_plugins.txt to ./tgdiary/tgdiary.egg-info/paster_plugins.txt Copying sqlobject.txt_tmpl to ./tgdiary/tgdiary.egg-info/sqlobject.txt Recursing into +package+ Creating ./tgdiary/tgdiary/ Copying __init__.py_tmpl to ./tgdiary/tgdiary/__init__.py Copying release.py_tmpl to ./tgdiary/tgdiary/release.py Recursing into static Creating ./tgdiary/tgdiary/static/ Recursing into css Creating ./tgdiary/tgdiary/static/css/ Copying empty to ./tgdiary/tgdiary/static/css/empty Recursing into images Creating ./tgdiary/tgdiary/static/images/ Copying favicon.ico to ./tgdiary/tgdiary/static/images/favicon.ico Copying tg_under_the_hood.png to ./tgdiary/tgdiary/static/images/tg_under_the_hood.png Copying under_the_hood_blue.png to ./tgdiary/tgdiary/static/images/under_the_hood_blue.png Recursing into javascript Creating ./tgdiary/tgdiary/static/javascript/ Copying empty to ./tgdiary/tgdiary/static/javascript/empty Recursing into templates Creating ./tgdiary/tgdiary/templates/ Copying __init__.py_tmpl to ./tgdiary/tgdiary/templates/__init__.py Creating template turbogears Recursing into +package+ Recursing into config Creating ./tgdiary/tgdiary/config/ /var/lib/python-support/python2.4/Cheetah/Compiler.py:1556: UserWarning: You supplied an empty string for the source! warnings.warn("You supplied an empty string for the source!", ) Copying __init__.py_tmpl to ./tgdiary/tgdiary/config/__init__.py Copying app.cfg_tmpl to ./tgdiary/tgdiary/config/app.cfg Copying log.cfg_tmpl to ./tgdiary/tgdiary/config/log.cfg Copying controllers.py_tmpl to ./tgdiary/tgdiary/controllers.py Copying json.py_tmpl to ./tgdiary/tgdiary/json.py Copying model.py_tmpl to ./tgdiary/tgdiary/model.py Recursing into sqlobject-history Creating ./tgdiary/tgdiary/sqlobject-history/ Copying empty to ./tgdiary/tgdiary/sqlobject-history/empty Recursing into static Recursing into css Copying style.css to ./tgdiary/tgdiary/static/css/style.css Recursing into images Copying header_inner.png to ./tgdiary/tgdiary/static/images/header_inner.png Copying info.png to ./tgdiary/tgdiary/static/images/info.png Copying ok.png to ./tgdiary/tgdiary/static/images/ok.png Recursing into templates Copying login.kid to ./tgdiary/tgdiary/templates/login.kid Copying master.kid to ./tgdiary/tgdiary/templates/master.kid Copying welcome.kid to ./tgdiary/tgdiary/templates/welcome.kid Recursing into tests Creating ./tgdiary/tgdiary/tests/ Copying __init__.py_tmpl to ./tgdiary/tgdiary/tests/__init__.py Copying test_controllers.py_tmpl to ./tgdiary/tgdiary/tests/test_controllers.py Copying test_model.py_tmpl to ./tgdiary/tgdiary/tests/test_model.py Copying README.txt_tmpl to ./tgdiary/README.txt Copying dev.cfg_tmpl to ./tgdiary/dev.cfg Copying sample-prod.cfg_tmpl to ./tgdiary/sample-prod.cfg Copying setup.py_tmpl to ./tgdiary/setup.py Copying start-+package+.py_tmpl to ./tgdiary/start-tgdiary.py Copying test.cfg_tmpl to ./tgdiary/test.cfg Running /usr/bin/python setup.py egg_info Adding TurboGears to paster_plugins.txt running egg_info writing requirements to tgdiary.egg-info/requires.txt writing tgdiary.egg-info/PKG-INFO writing top-level names to tgdiary.egg-info/top_level.txt writing dependency_links to tgdiary.egg-info/dependency_links.txt reading manifest file 'tgdiary.egg-info/SOURCES.txt' writing manifest file 'tgdiary.egg-info/SOURCES.txt'
開発用サーバを起動する。
プロジェクトのディレクトリにあるstart-tgdiary.pyを実行すると、開発用のサーバが起動します。
$ python start-tgdiary.py [~/projects/tgdiary] 2007-01-15 21:57:10,726 cherrypy.msg INFO CONFIG: Server parameters: 2007-01-15 21:57:10,726 cherrypy.msg INFO CONFIG: server.environment: development 2007-01-15 21:57:10,726 cherrypy.msg INFO CONFIG: server.log_to_screen: True 2007-01-15 21:57:10,727 cherrypy.msg INFO CONFIG: server.log_file: 2007-01-15 21:57:10,727 cherrypy.msg INFO CONFIG: server.log_tracebacks: True 2007-01-15 21:57:10,727 cherrypy.msg INFO CONFIG: server.log_request_headers: True 2007-01-15 21:57:10,728 cherrypy.msg INFO CONFIG: server.protocol_version: HTTP/1.0 2007-01-15 21:57:10,728 cherrypy.msg INFO CONFIG: server.socket_host: 2007-01-15 21:57:10,728 cherrypy.msg INFO CONFIG: server.socket_port: 8080 2007-01-15 21:57:10,729 cherrypy.msg INFO CONFIG: server.socket_file: 2007-01-15 21:57:10,729 cherrypy.msg INFO CONFIG: server.reverse_dns: False 2007-01-15 21:57:10,729 cherrypy.msg INFO CONFIG: server.socket_queue_size: 5 2007-01-15 21:57:10,729 cherrypy.msg INFO CONFIG: server.thread_pool: 10 2007-01-15 21:57:10,797 turbogears.visit INFO Visit Tracking starting 2007-01-15 21:57:10,881 turbogears.visit.sovisit INFO Succesfully loaded "tgdiary.model.Visit" 2007-01-15 21:57:10,882 turbogears.visit INFO Visit filter initialised 2007-01-15 21:57:11,456 turbogears.identity INFO Identity starting 2007-01-15 21:57:11,565 turbogears.identity.soprovider INFO Succesfully loaded "tgdiary.model.User" 2007-01-15 21:57:11,565 turbogears.identity.soprovider INFO Succesfully loaded "tgdiary.model.Group" 2007-01-15 21:57:11,566 turbogears.identity.soprovider INFO Succesfully loaded "tgdiary.model.Permission" 2007-01-15 21:57:11,566 turbogears.identity.soprovider INFO Succesfully loaded "turbogears.identity.soprovider.TG_VisitIdentity" 2007-01-15 21:57:11,696 turbogears.identity INFO Identity visit plugin initialised 2007-01-15 21:57:11,700 turbogears.identity.soprovider INFO Succesfully loaded "tgdiary.model.User" 2007-01-15 21:57:11,701 turbogears.identity.soprovider INFO Succesfully loaded "tgdiary.model.Group" 2007-01-15 21:57:11,701 turbogears.identity.soprovider INFO Succesfully loaded "tgdiary.model.Permission" 2007-01-15 21:57:11,701 turbogears.identity.soprovider INFO Succesfully loaded "turbogears.identity.soprovider.TG_VisitIdentity" 2007-01-15 21:57:11,927 cherrypy.msg INFO HTTP: Serving HTTP on http://localhost:8080/
http://127.0.0.1:8080/にアクセスすると、以下の画面が表示されます。
Ctrl+Cを押すと、開発用サーバは終了します。
2007-01-15 22:19:15,604 cherrypy.msg INFO ENGINE:hit: shutting down autoreloader 2007-01-15 22:19:16,012 cherrypy.msg INFO ENGINE: hit: shutting down autoreloader 2007-01-15 22:19:16,072 cherrypy.msg INFO HTTP: HTTP Server shut down 2007-01-15 22:19:16,511 turbogears.visit INFO Visit Tracking shutting down 2007-01-15 22:19:16,535 cherrypy.msg INFO HTTP: HTTP Server shut down 2007-01-15 22:19:16,590 turbogears.visit INFO Visit Tracking shutting down 2007-01-15 22:19:16,616 turbogears.identity INFO Identity shutting down 2007-01-15 22:19:16,617 cherrypy.msg INFO ENGINE: CherryPy shut down 2007-01-15 22:19:16,654 turbogears.identity INFO Identity shutting down 2007-01-15 22:19:16,678 cherrypy.msg INFO ENGINE: CherryPy shut down