modwsgiでDjangoアプリケーションをサイトルート以外に設置する

Apache/modwsgi環境でサイトルート直下以外にDjangoを設置する方法。
Djangoのプロジェクトをサイトルート以外にデプロイする-解決編 - 偏った言語信者の垂れ流し
以前同じようなタイトルで書いたのだけど、そのときはDjango0.97preだったので、Django1.2の場合どうなるか書く。
1.2では、パスの問題なども解決されて、問題なく動くようになっている。
通常通りwsgiの設定にすればok。
Django以外も含めて注意点としては、

  • URLはreverseやurlタグなどの逆引きを使う
  • 静的なメディアには {{ MEDIA_URL }} のプレフィックスをつける
  • javascript絶対パスを利用する場合はMEDIA_URLを渡す
  • cssでパスを使う場合は相対指定にする

ぐらいです。

ディレクトリ構成
myproject
|-- __init__.py
|-- django.wsgi
|-- manage.py
|-- settings.py
|-- settings_prod.py
|-- static
|   `-- crosskylix.jpg
|-- templates
|   `-- index.html
`-- urls.py
settings.py
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

DEBUG = True

MEDIA_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/static/'

ROOT_URLCONF = 'myproject.urls'

TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

INSTALLED_APPS = ()
settings_prod.py
from settings import *

DEBUG = False

MEDIA_URL = '/test/static/'
urls.py
from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
    url(r'^$', 'django.views.generic.simple.direct_to_template',
        {'template': 'index.html'}, 'index'),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*\.(jpg|gif|png|js|css))$', 'django.views.static.serve',
         {'document_root': settings.MEDIA_ROOT}),
    )
templates/index.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test page</title>
</head>
<body>
<pre>
このページのURL: {% url index %}
MEDIA_URL: {{ MEDIA_URL }}
画像テスト:
</pre>
<img src="{{ MEDIA_URL }}crosskylix.jpg" />
</body>
</html>
django.wsgi
import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings_prod'

PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_DIR_UP = os.path.dirname(PROJECT_DIR)

if PROJECT_DIR not in sys.path:
    sys.path.append(PROJECT_DIR)

if os.path.dirname(PROJECT_DIR) not in sys.path:
    sys.path.append(PROJECT_DIR_UP)

from django.core.handlers.wsgi import WSGIHandler

application = WSGIHandler()
ApacheのVirtualHost設定
<VirtualHost *:80>
  ServerAdmin webmaster@localhost

  WSGIScriptAlias /test/ /home/tokibito/_sandbox/myproject/django.wsgi

  Alias /test/static/ /home/tokibito/_sandbox/myproject/static/
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory /home/tokibito/_sandbox/myproject/static/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>

  ErrorLog /var/log/apache2/error.log
  LogLevel warn
  CustomLog /var/log/apache2/access.log combined

</VirtualHost>
runserverで動かしたとき

Apache/modwsgiでサイトルート以外で動かしたとき