Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

Несколько доменов

#python #django

                    
Необходимо чтобы по поддомену выполнялся своё приложение.

Есть site.com, нужно чтобы по main.site.con вызывалось приложение 'apps.views.main'

Попробовал сделать это через middleware:  

class SomeDomainMiddleware(object):
    def process_request(self, request):
         if request.META['HTTP_HOST'] == 'main.site.con':
            return HttpResponseRedirect('/main/')
         else:
            return HttpResponseRedirect('/')


Пробовал через return HttpResponseRedirect(reverse('apps.views.main')), но ругается
что не передал args и kwargs, хотя кроме request там ничего и не нужно.

Пробовал на уровне lighttpd разделить поддомен, но тут тоже проблема, спрашивал тут,
но увы никто не помог.

P.S. не хочется через SITE_ID делать это, так как по сути сайт один, просто приложение
такое себе на поддомене.
    


Ответы

Ответ 1



По перебирал варианты, найдя точки остановок, вывел такой код: class SomeDomainMiddleware(object): def process_request(self, request): if request.META['HTTP_HOST'] == 'main.site.com': if request.META['REQUEST_URI'] == '/': return HttpResponseRedirect('/main/') else: if request.META['REDIRECT_STATUS'] != '200': return HttpResponseRedirect('/') Конструкции request.META['REDIRECT_STATUS'] != '200' и if request.META['REQUEST_URI'] != '/main/' нужны, чтобы были точки остановки, без них редирект будет бесконечным, а точнее то ограниченное чисто рас, сколько сервер разрешит, после чего будет выдано - ничего, как-то так. А эти ограничения говорят нам что редирект уже был и нужно пропустить редирект. Если кто-то имеет элегантнее способ, прошу все же поделится, так как понимаю что мой способ похож на грабли, хотя имеет место на жизнь.

Ответ 2



Можно на поддомен положить свой .wsgi, который будет сразу запускать Ваше приложение. Если нужна какая-то интеграция с основным сайтом, то в .wsgi можно указать другой файл settings, например, subdomain_settings.py, в который импортировать основные settings: from settings import * А затем перекрыть требуемые элементы, например: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'ANOTHER_DB', 'USER': 'ANOTHER_USER', 'PASSWORD': 'ANOTHER_PASS', 'HOST': '127.0.0.1', 'PORT': '', } } MEDIA_ROOT = '/home/user/media' MEDIA_URL = '/media/'

Комментариев нет:

Отправить комментарий