[TurboGears] ブログを作成する。その1

趣旨

私は外部からは閲覧できない自宅サーバで、個人的なメモを記録するためのブログを動かしています。現在はtDiaryを利用していますが、以下のような要望が出てきました。

  1. 1日に複数件の記事を記録したい。
  2. はてなと同様の記法をしたい。
  3. コメントやトラックバックはいらない。

本来なら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