django项目

时间:2018-04-09 19:49:09

标签: python django django-urls

我正在尝试在我的django项目中实现动态子域和urls系统。

通常,每个用户都有自己的域名,例如。 myusername.example.com 用户可以定义动态URL,例如:

  • myusername.example.com/something1
  • myusername.example.com/something2
  • myusername2.example.com/something1
  • myusername2.example.com/something2

但是我的网站也在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。

1 个答案:

答案 0 :(得分:2)

您需要有两个不同的网址文件。一个用于域,第二个用于子域。

  • 拆分两个url文件中的域和子域视图。如果你有适用于两者的视图,例如登录,创建一个" common"文件并包含在两个网址中。
  • 您可以选择要使用的网址,因此请创建中间件并检查主机request.META.get('HTTP_HOST')。如果请求来自子域名,则只需加载适当的网址request.urlconf = 'path.to_subdomain.urls'

注意: 请确保settings.py中的ROOT_URLCONF指向"域'网址。此外,在您的中间件中,您应该检查子域是否存在,如果它不存在则返回404.