我正在尝试为应用添加一些简单的租赁支持,创建一个帐户模型,其中有一个字符串'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
答案 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