Форум сайта python.su
Доброго времени суток!
Подскажите плз начинающему.
Задача такая: есть джанго проэкт, созданный командой django-admin.py startproject prj1, а внем 2 приложения, созданных командами ./manage.py startapp app1 и ./manage.py startapp app2. Хотелось бы средствами apache (virtualhost) для каждого приложения (внутри проэкта prj1) создать свой VirtualHost. Хочу обращатся к ним не как http://prj1.domaim.ru/app1 или http://prj1.domaim.ru/app2, а
например вот так http://app1.domaim.ru/.
Что у меня получилось:
структура каталога prj1
prj1
автоматичесуи созданные файлы
app1
автоматичесуи созданные файлы
app2
автоматичесуи созданные файлы
wsgi
wsgi.py
содержимое wsgi.py:
import sys
import os
import os.path
sys.path.append('/www/django')
os.environ['DJANGO_SETTINGS_MODULE'] = 'prj1.settings'
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
<VirtualHost *:80>
ServerAdmin admin@domain.ru
DocumentRoot "/www/django/prj1/app1"
ServerName app1.domain.ru
ErrorLog "/var/log/www/app1-error_log"
CustomLog "/var/log/www/app1-access_log" common
DirectoryIndex index.html
<Directory "/www/django/prj1/app1">
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / /www/django/prj1/wsgi/wsgi.py
<Directory "/www/django/prj1/wsgi">
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^prj1/', include('abztools.foo.urls')),
url(r'^app1.domain.ru/', include('prj1.app1.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
# (r'^admin/', include(admin.site.urls)),
)
Офлайн
Ну я конечно не большой знаток. У меня два варианта
1. Вместо
url(r'^app1.domain.ru/', include('prj1.app1.urls')),
url(r'^$', include('prj1.app1.urls')),
Офлайн
dissdocдумаю, что этим проблема не решается. т.к. в итоге я не могу отличить app1 от app2
url(r'^$', include('prj1.app1.urls')),
dissdocНе совсем понял, что имеется в виду… если речь идет про hosts рабочей станции (откуда я делаю запрос) то там написано
Или не прописано ничего в хостах твоей ОС
Офлайн
Теоретически делаем все имена алиасами на один виртуалхост. Далее с помощью mod_rewrite переписываем URL (имя хоста в начало пути в URL). Практически - нужно попробовать, интересная задача.
Офлайн
Тут перевод документации джанго http://www.djbook.ru/.
lorienСпасибо, очень интересно, буду копать.
Можно попробовать сделать middleware, который по поддомену будет активировать нужные urlpatterns, которые в свою очередь будут прицеплены к нужным вьюшкам.
Офлайн
вот интересная ссылочка http://dmkonweb.ru/blog/2009/03/22/multiple-sites-in-single-project/, тут варианты решения данной проблемы с mod_python и FastCGI, для mod_wsgi пока не нашел но и эти не проверял.
Офлайн
Делал по аналогии http://effbot.org/zone/django-multihost.htm, только ничего не патчил.
multihost.py
from django.conf import settings
class MultiHostMiddleware:
def process_request(self, request):
try:
host = request.META['SERVER_NAME']
settings.ROOT_URLCONF = settings.MULTIHOST_URLCONF_MAP[host]
except:
pass
MULTIHOST_URLCONF_MAP = {
'app1.domain.ru': 'prj1.app1.urls',
'app1.domain.ru': 'prj1.app2.urls',
}
Офлайн
c шаблонами решил так:
в корне проэкта создал каталог templates. структура каталога:
app1
index.html
app2
index.html
base.html
import os.path
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)
#t = loader.get_template("index.html")
t = loader.get_template("app1/index.html")
Офлайн