Django Custom Dynamic urlpatterns
Я работаю над проектом django и в этом проекте у меня есть два подпроекта. В данном случае я хочу хранить домены и назначать сервисы (мои подпроекты) этим доменам.
Например, допустим, у меня есть сервис1 и сервис2. И в таблице доменов я храню:
service1.domain.com -> service1
domainforservice1.com -> service1
service2.domain.com -> service2
domainforservice2.com -> service2
что-то вроде этого. В этом случае я столкнулся с некоторыми проблемами, потому что я хочу контролировать домен, к которому поступает запрос, и в соответствии с этим доменом я могу найти, какой сервис мне следует загрузить на главном пути. Итак, в основном мы хотим сделать такой элемент управления:
if domain.service = service1:
urlpatterns += path('', service1.urls)
if domain.service = service2:
urlpatterns += path('', service2.urls)
Но проблема в том, что поскольку мы не можем взять домен в этой области из запроса, мы не можем сделать этот контроль. Я попытался написать промежуточное ПО для этого и получил адрес домена в request.domain, но снова возникла проблема, потому что промежуточное ПО выполняется до этого файла urls.py. Так что в этом случае я застрял и не могу найти решение, чтобы решить эту проблему.
django поддерживает несколько сайтов с помощью фреймворка sites framework. https://docs.djangoproject.com/en/5.0/ref/contrib/sites/
# site1 settings.py
SITE_ID = 1
ALLOWED_HOSTS = [aaa.com]
$ python manage.py runserver --settings={site1.settings}
# site2 settings.py
SITE_ID = 2
ALLOWED_HOSTS = [bbb.com]
$ python manage.py runserver --settings={site2.settings}
и
from django.contrib.sites.shortcuts import get_current_site
from django.http import Http404
def my_view(request):
current_site = get_current_site(request)
if current_site.domain == "foo.com":
# Do something
else:
raise Http404
или
# views.py
from django.conf import settings
from django.http import Http404
def some_view(request, *args):
if settings.SITE_ID == 3:
# do something
else:
raise Http404
https://docs.djangoproject.com/en/5.0/ref/contrib/sites/#hooking-into-the-current-site-from-views