Django多租户网址配置

时间:2012-09-04 22:34:01

标签: python django multi-tenant

我正在尝试为应用添加一些简单的租赁支持,创建一个帐户模型,其中有一个字符串'tenant'可以从请求URL中读取并识别系统中的租户:

租户 .example.com / * - > www.example.com/tenant/*(由apache改写)

我写了一个简单的中间件来从request.path捕获这个/ tenant /并添加一个request.account对象来处理。

我的问题是我的网址映射。

我试过了:

url(r'^(?P<tenant_id>[\w\-]+)/', include('project.urls_tenant')),

并在urls_tenant.py中定义了一些简单的网址:

url(r'^app1/', include('project.app1.urls')),

url(r'^app2/', include('project.app2.urls')),

当我尝试访问任何页面时,收到错误消息:

  

generic_view_method()获得了一个意外的关键字参数'tenant_id'

因为它没有(实际上不应该)期望tenant_id作为参数。

如果我将 urls.py 文件中的 tenant_id 硬编码为 / test_tenant / ,一切正常。

我做错了什么以及如何修复它,以便正常处理请求和响应?

非常感谢你们。我用它作为参考:optimal architecture for multitenant application on django

2 个答案:

答案 0 :(得分:0)

如果我理解您的设置正确,您已定义:

url(r'^(?P<tenant_id>[\w\-]+)/', include('project.urls_tenant')),

在我们的主urls.py文件和urls_tenant.py文件中的其他行?

从那里获取它不会有任何匹配^(?P [\ w - ] +)/的传递请求 通过urls_tenant.py文件?您在那里定义的两行只能匹配/ app1或/ app2。

但我只是猜测我还没有完全理解你的设置?

我认为如果您将租户网址映射到特定视图而不是包含不同的urls.py文件会更好 (我甚至不知道这是可能的)。

url(r'^(?P<tenant_id>[\w\-]+)/', TenantView.as_view(), name="tenant-view"),

上面的内容对我来说看起来更像是django。

答案 1 :(得分:0)

当你显然不需要时,你正在url模式中捕获命名参数tenant_id。尝试删除括号以避免执行捕获:

url(r'^[\w\-]+/', include('project.urls_tenant')),

此页面通常很有用: https://docs.djangoproject.com/en/dev/topics/http/urls/#how-django-processes-a-request