Блогът на Степан Родионов Работа с персонализирани поддомейни в уеб приложение Django
Блог за разработка на софтуер и технологични интернет решения
Моите контакти
Работа с персонализирани поддомейни в уеб приложение на Django
Нашата компания в момента разработва SaaS система за доставчици, чийто софтуер се продава чрез абонамент. Като се регистрира в нашата система, продавачът може да създаде поддомейн, който ще показва уебсайт с информация за неговата компания и решението, което предлага. Този сайт може да бъде персонализиран по всякакъв начин, но сега няма да говорим за това. Бих искал да говоря за това как внедрихме възможността за създаване на персонализирани поддомейни и тяхната обработка.
Поддомейните са много удобни, когато информацията за клиентите на услугата може и трябва да се показва в Интернет. Просто URI "antida.service.com" изглежда по-добре от "service.com/partner/antida" или "service.com/antida". Ако поддомейните в нашата система са предварително дефинирани и известни, тогава можете просто да използвате обикновени CNAME или A записи, когато настройвате DNS.
Но какво ще стане, ако искаме да създадем или управляваме поддомейни, докато нашето уеб приложение работи? Има три основни стъпки, които трябва да следвате:
- конфигуриране на DNS;
- настройте уеб сървър;
- добавете функционалност за работа с поддомейни към кода на вашето уеб приложение.
Настройка на DNS
Такъв запис ще съответства както на www.service.com, така и на beta.service.com и т.н.
Настройка на уеб сървър
В конфигурацията на уеб сървъра трябва да извършите подобна операция по същество - трябва уеб сървърът да разбере, че трябва да отговаря на заявки към всеки поддомейн. В нашия случай имаше Apache, чиято конфигурация изглежда така:
Конфигурацията за Nginx ще изглежда така:
Този сървър и DNS конфигурация трябва да са достатъчни, за да може вашето уеб приложение да отговаря на заявки за всеки поддомейн. Сега остава само да научим нашия софтуер да разбира до кой домейн има достъп потребителят.
Програмиране
Просто трябва да направим няколко корекции в нашето приложение.
Първо трябва да добавите subdomains.middleware.SubdomainURLRoutingMiddleware към списъка MIDDLEWARE_CLASSES във вашия файл с настройки на Django проект. Ако използвате django.middleware.common.CommonMiddleware, тогава subdomains.middleware.SubdomainURLRoutingMiddleware трябва да е преди него.
След това трябва да дефинирате ROOT_URLCONF и SUBDOMAIN_URLCONFS във вашия файл с настройки на проекта Django.
ROOT_URLCONF ще се използва в случаите, когато заявката за текущия поддомейн не е дефинирана в нито една от конфигурациите в SUBDOMAIN_URLCONFS. Тази опция е точно за нашия случай, когато името на клиента може да бъде поддомейн и не е дефинирано първоначално в нашия проект.
Остава да дефинирате SITE_ID в настройките и вашето уеб приложение е готово да обработва заявки за всякакви персонализирани поддомейни. Пример за използване на поддомейн: