Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 26, 2010 15:28:11

muk
От:
Зарегистрирован: 2009-08-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Django проэкт и виртуальные хосты

Доброго времени суток!
Подскажите плз начинающему.
Задача такая: есть джанго проэкт, созданный командой 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



Офлайн

#2 Фев. 27, 2010 13:20:52

dissdoc
От:
Зарегистрирован: 2009-12-12
Сообщения: 273
Репутация: +  0  -
Профиль   Отправить e-mail  

Django проэкт и виртуальные хосты

Ну я конечно не большой знаток. У меня два варианта
1. Вместо

url(r'^app1.domain.ru/', include('prj1.app1.urls')),
Сделать
url(r'^$', include('prj1.app1.urls')),
Или не прописано ничего в хостах твоей ОС



Офлайн

#3 Фев. 27, 2010 14:06:20

muk
От:
Зарегистрирован: 2009-08-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Django проэкт и виртуальные хосты

dissdoc
url(r'^$', include('prj1.app1.urls')),
думаю, что этим проблема не решается. т.к. в итоге я не могу отличить app1 от app2
может я не точно выразился - мне к каждому приложению в проэкте нужен свой виртуальный хост, чтоб обращатся к ним как
app1.domain.ru и app2.domain.ru

dissdoc
Или не прописано ничего в хостах твоей ОС
Не совсем понял, что имеется в виду… если речь идет про hosts рабочей станции (откуда я делаю запрос) то там написано
10.0.0.10 app1.domain.ru



Офлайн

#4 Фев. 27, 2010 16:52:44

AlexKiriukha
От:
Зарегистрирован: 2008-02-03
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Django проэкт и виртуальные хосты

Теоретически делаем все имена алиасами на один виртуалхост. Далее с помощью mod_rewrite переписываем URL (имя хоста в начало пути в URL). Практически - нужно попробовать, интересная задача.



Офлайн

#5 Фев. 28, 2010 12:29:33

muk
От:
Зарегистрирован: 2009-08-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Django проэкт и виртуальные хосты

Тут перевод документации джанго http://www.djbook.ru/.

lorien
Можно попробовать сделать middleware, который по поддомену будет активировать нужные urlpatterns, которые в свою очередь будут прицеплены к нужным вьюшкам.
Спасибо, очень интересно, буду копать.



Офлайн

#6 Март 3, 2010 21:37:07

muk
От:
Зарегистрирован: 2009-08-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Django проэкт и виртуальные хосты

вот интересная ссылочка http://dmkonweb.ru/blog/2009/03/22/multiple-sites-in-single-project/, тут варианты решения данной проблемы с mod_python и FastCGI, для mod_wsgi пока не нашел но и эти не проверял.



Офлайн

#7 Март 8, 2010 09:48:54

muk
От:
Зарегистрирован: 2009-08-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Django проэкт и виртуальные хосты

Делал по аналогии 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”) он просто выбирает первый из списка найденных каталогов. в итоге для каждого урла будет один и тот же шаблон.



Офлайн

#8 Март 8, 2010 10:38:55

muk
От:
Зарегистрирован: 2009-08-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Django проэкт и виртуальные хосты

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.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version