Найти - Пользователи
Полная версия: Django проэкт и виртуальные хосты
Начало » Django » Django проэкт и виртуальные хосты
1
muk
Доброго времени суток!
Подскажите плз начинающему.
Задача такая: есть джанго проэкт, созданный командой 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>
содержимое urls.py (каталог prj1):
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)),
)
в settings.py приложение подключено.
при попытке подключится по адресу http://app1.domain.ru/ появляется страничка следующего содержания:
Page not found (404)
Request Method: GET
Request URL: http://app1.domain.ru/

Using the URLconf defined in abztools.urls, Django tried these URL patterns, in this order:

^app1.domain.ru/
The current URL, , didn't match any of these.

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.


софт: freebsd 7.2, apache 2.2.14, mod_wsgi 2.8, python 2.6.4, django 1.1.1
dissdoc
Ну я конечно не большой знаток. У меня два варианта
1. Вместо
url(r'^app1.domain.ru/', include('prj1.app1.urls')),
Сделать
url(r'^$', include('prj1.app1.urls')),
Или не прописано ничего в хостах твоей ОС
muk
dissdoc
url(r'^$', include('prj1.app1.urls')),
думаю, что этим проблема не решается. т.к. в итоге я не могу отличить app1 от app2
может я не точно выразился - мне к каждому приложению в проэкте нужен свой виртуальный хост, чтоб обращатся к ним как
app1.domain.ru и app2.domain.ru

dissdoc
Или не прописано ничего в хостах твоей ОС
Не совсем понял, что имеется в виду… если речь идет про hosts рабочей станции (откуда я делаю запрос) то там написано
10.0.0.10 app1.domain.ru
AlexKiriukha
Теоретически делаем все имена алиасами на один виртуалхост. Далее с помощью mod_rewrite переписываем URL (имя хоста в начало пути в URL). Практически - нужно попробовать, интересная задача.
muk
Тут перевод документации джанго http://www.djbook.ru/.

lorien
Можно попробовать сделать middleware, который по поддомену будет активировать нужные urlpatterns, которые в свою очередь будут прицеплены к нужным вьюшкам.
Спасибо, очень интересно, буду копать.
muk
вот интересная ссылочка http://dmkonweb.ru/blog/2009/03/22/multiple-sites-in-single-project/, тут варианты решения данной проблемы с mod_python и FastCGI, для mod_wsgi пока не нашел но и эти не проверял.
muk
Делал по аналогии 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
в settings.py добавил
MULTIHOST_URLCONF_MAP = {
'app1.domain.ru': 'prj1.app1.urls',
'app1.domain.ru': 'prj1.app2.urls',
}
работает замечательно, только вот осталось шаблоны победить. Дело в том, что механизм шаблонов джанго (его ФС вариант) просканировав дерево проэкта, нашел у меня два каталога с шаблонами (в app1/templates и app2/templates) и когда в представлении я вызываю
t = loader.get_template(“index.html”) он просто выбирает первый из списка найденных каталогов. в итоге для каждого урла будет один и тот же шаблон.
muk
c шаблонами решил так:

в корне проэкта создал каталог templates. структура каталога:
app1
index.html
app2
index.html
base.html
в settings.py
import os.path
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)
в представлении app1:
#t = loader.get_template("index.html")
t = loader.get_template("app1/index.html")
и аналогично для app2.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB