Feedjack 読む (2)

続行。試験も色々試しつつ、とは思っているのですがどうなるか。
ええと、まず urls.py から見てみる。ソースを全部 paste すると微妙なのでちょっとづつで、最初のブロックから

urlpatterns = patterns('',
    (r'^rss20.xml$', redirect_to,
      {'url':'/feed/rss/'}),
    (r'^feed/$', redirect_to,
      {'url':'/feed/atom/'}),
    (r'^feed/rss/$', views.rssfeed),
    (r'^feed/atom/$', views.atomfeed),

どんなデータが云々は置いといて順に意味を類推

  • 最初のソレは URL が /rss20.xml なら /feed/rss/ に redirect
  • 次。URL が /feed/ だったら /feed/atom/ に redirect
  • URL が /feed/rss/ なら views.py の rssfeed メソド起動
  • URL が /feed/atom なら views.py の atomfeed メソド起動

と見た。次。

    (r'^feed/user/(?P<user>\d+)/tag/(?P<tag>.*)/$', redirect_to,
      {'url':'/feed/atom/user/%(user)s/tag/%(tag)s/'}),
    (r'^feed/user/(?P<user>\d+)/$', redirect_to,
      {'url':'/feed/atom/user/%(user)s/'}),
    (r'^feed/tag/(?P<tag>.*)/$', redirect_to,
      {'url':'/feed/atom/tag/%(tag)s/'}),

む。最初のでいきなりつまづく。URL ディスパッチャ な文書を見てみた。
む、違うな。先に正規表現から確認した方が良いのかな??

  • 名前つき正規表現は (?Ppattern) で表記
    • name がグループの名前 (この名前で view に値が渡る
    • pattern がマッチさせるパターン

との事。name を参照するには %(name)s という記述で良い模様。ちょっとどこにもこれに関する記述が無いっぽく見えるのですが、探し方が悪いに違いない。
という事で上のソレ達は

  • URL が /feed/user/1/tag/xxx/ とかな場合、/feed/atom/user/1/tag/xxxx/ に redirect
  • URL が /feed/user/1/ なら /feed/atom/user/1/ に redirect
  • URL が /feed/tag/xxxx/ なら /feed/atom/tag/xxxx/ に redirect

次からが実際に view なソレが起動されるナニ。

    (r'^feed/atom/user/(?P<user>\d+)/tag/(?P<tag>.*)/$', views.atomfeed),
    (r'^feed/atom/user/(?P<user>\d+)/$', views.atomfeed),
    (r'^feed/atom/tag/(?P<tag>.*)/$', views.atomfeed),
    (r'^feed/rss/user/(?P<user>\d+)/tag/(?P<tag>.*)/$', views.rssfeed),
    (r'^feed/rss/user/(?P<user>\d+)/$', views.rssfeed),
    (r'^feed/rss/tag/(?P<tag>.*)/$', views.rssfeed),

ここは割と簡単。

  • URL が /feed/atom/なんたら/ だったら views.py の atomfeed メソド起動
  • URL が /feed/rss/なんたら/ だったら views.py の rssfeed メソド起動

それぞれ以下な定義になっている

def rssfeed(request, tag=None, user=None):
    """ Generates the RSS2 feed.
    """
    return buildfeed(request, feedgenerator.Rss201rev2Feed, tag, user)

def atomfeed(request, tag=None, user=None):
    """ Generates the Atom 1.0 feed. 
    """
    return buildfeed(request, feedgenerator.Atom1Feed, tag, user)

キーワード引数ってのもナニですな。次。

    (r'^user/(?P<user>\d+)/tag/(?P<tag>.*)/$', views.mainview),
    (r'^user/(?P<user>\d+)/$', views.mainview),
    (r'^tag/(?P<tag>.*)/$', views.mainview),

上記な URL は views.py の mainview メソド起動。このメソドも

def mainview(request, tag=None, user=None):

な定義。ラストが以下

    (r'^opml/$', views.opml),
    (r'^foaf/$', views.foaf),
    (r'^$', views.mainview),

views.py には他にもメソドが定義されてるんですが、Django って基本的に urls.py でマッピングされてない URL は 4xx なソレが戻るようになってるんだろうな。
直接起動なソレは

  • mainview (内部で initview)
  • opml (blogroll の戻りを戻している)
  • foaf (blogroll の戻りを戻している)
  • atomfeed (buildfeed の戻りを戻している)
  • rssfeed (buildfeed の戻りを戻している)

が入口、なんですが views.py なソレは基本的に response を戻してまして、テンプレートとの連携はどこを見れば分かるのでしょうか。
で、よくよく見てみると views.py の中で rendor_to_response (@mainview) とか loader.get_template (@initview) などというナニを呼び出しています。
views.py は掘り下げはじめるとキリが無さそげ。面白いんですが、一旦ストップ。あまり model 方面で試験する項目が無さげなので、こっちで云々と思ってはいるのですが、どうなりますでしょうか。続きは早くって明日だと思います。