我正在尝试在我的django项目中实现动态子域和urls系统。
通常,每个用户都有自己的域名,例如。 myusername.example.com 用户可以定义动态URL,例如:
但是我的网站也在example.com上运行,网址如example.com/contact,example.com/about-us等。
我希望所有这些URL指向我的自定义视图(基于类),我在其中执行一些数据库查询并返回动态内容。 somethin1 / something2部分是完全动态的,可能有任何东西。由用户定义。
我有这样的事情:
urls.py
from web.views import HomeView, ContactView
urlpatterns = [
path('admin/', admin.site.urls),
path('contact', ContactView.as_view()),
path('', HomeView.as_view()),
re_path('.*', HomeView.as_view())
]
web.views.py
class HomeView(TemplateView):
template_name = 'home.html'
def dispatch(self, request, *args, **kwargs):
SERVICE_DOMAIN = settings.DOMAIN
http_host = str(request.META.get('HTTP_HOST'))
if SERVICE_DOMAIN in http_host:
subdomains = http_host.split(SERVICE_DOMAIN)[0]
subdomain = slugify.slugify(subdomains)
else:
subdomain = False
if subdomain:
print('Our subdomain is {}'.format(subdomain))
kwargs['subdomain'] = subdomain
return CustomUrlView.as_view()(self.request, *args, **kwargs)
if not subdomain:
print('run normally')
return super().dispatch(request, *args, **kwargs)
class CustomUrlView(View):
def dispatch(self, request, *args, **kwargs):
subdomain = kwargs.get('subdomain')
url = request.META.get('PATH_INFO').lower().strip().replace('/', '', 1)
# here I do some queries in DB with my url variable - it has own model etc.
通常,几乎所有用户定义的网址都能正常运行... 问题是访问者打开myusername.example.com/contact时 - 它始终与urls.py中定义的url匹配,而且我的HomeView没有捕获它。
我该如何解决?当请求来自子域时,我不想使用在urls.py中定义的任何基于类的视图的URL。
答案 0 :(得分:2)
您需要有两个不同的网址文件。一个用于域,第二个用于子域。
request.META.get('HTTP_HOST')
。如果请求来自子域名,则只需加载适当的网址request.urlconf = 'path.to_subdomain.urls'
注意强>:
请确保settings.py中的ROOT_URLCONF
指向"域'网址。此外,在您的中间件中,您应该检查子域是否存在,如果它不存在则返回404.