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>