0

我正在尝试向应用程序添加一些简单的租户支持,创建一个帐户模型,该模型具有要从请求 url 中读取的字符串“租户”并识别系统中的租户:

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

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

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

我试过这个:

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

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

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/一切正常。

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

非常感谢你们。我以此作为参考:django 上多租户应用程序的最佳架构

4

2 回答 2

0

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

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

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

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

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

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

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

像上面这样的东西对我来说看起来更像 django。

于 2012-09-05T06:47:31.837 回答
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

于 2012-09-05T09:53:08.577 回答