2010年10月18日月曜日

Django スラッシュが付いていないURLをスラッシュ付きのURLにリダイレクト


http://localhost:8001/admin

上のURLにアクセスした場合、Django管理インターフェースで無く、開発アプリケーション画面が表示されることがある。
このURLには最後にスラッシュが付いていないため、Djangoは管理インターフェースURLではなくアプリケーションURLにマッチングしていると判断するからである。

(参考)管理インターフェースのURL http://localhost:8001/admin/

URLの最後にスラッシュが付く場合と付かない場合では、表示画面が違っており使いにくい。
この問題解決のために、Djangoにはスラッシュ付きURLにリダイレクト設定というものがある。設定について、以下説明を行う。
  • リダイレクト設定

    プロジェクトの settings.py ファイルに次の記述を追加する。
    APPEND_SLASH = True
    
    この設定を行うと、自動的にスラッシュ付きURLにリダイレクトしてくれる。

  • ミドルウェアー設定

    このリダイレクト動作させるには、次のミドルウェアー設定を行っておく必要がある。
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    
    これは settings.py のMIDDLEWARE_CLASSES に設定するが、通常はデフォルトで動作するよう設定されている。

  • urlpatternsの設定とリダイレクト動作の解説

    Django ver0.96は APPEND_SLASH の設定だけでスラッシュがないものを自動的にリダイレクトする動作をしていた。
    Django ver1.0以降は明示的にスラッシュの無いパターンもキャッチできるよう、URLパターン中にマッチするものがない場合にリダイレクトするように仕様が変更になった。

    つまり urls.py の urlpatterns に次のように設定されていた場合、
    (r'^admin/', include(admin.site.urls)),
    (r'^','myprj.myapp.views.index'),
    
    ver1.0以降では http://localhost:8001/admin は一番のパターンにはマッチしないが、二番目のパターンにマッチするためリダイレクトしない。

    リダイレクトさせるためには次のように変更する。
    (r'^admin/', include(admin.site.urls)),
    (r'^index/','myprj.myapp.views.index'),
    
    つまりアプリケーションのURLパターンの正規表現を

      r'^'  →  r'^index/'

    へ変更する
    アプリケーションのURLは http://localhost:8001/ から http://localhost:8001/index/ に変更になるが、スラッシュが無いurl はリダイレクトするようになる。


    http://localhost:8001/ でアプリケーションURLにアクセスしたい場合は、どこかで(外のサーバー等) index/ にリダイレクトするように設定すれば良い。