【问题标题】:Django multitenant urls configurationDjango 多租户 URL 配置
【发布时间】:2012-08-29 15:09:35
【问题描述】:

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

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

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

我的问题是我的 url 映射。

我试过这个:

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

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

非常感谢你们。我以此为参考:optimal architecture for multitenant application on django

【问题讨论】:

    标签: python django multi-tenant


    【解决方案1】:

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

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

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

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

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

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

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

    上面的东西在我看来更像 django。

    【讨论】:

    • 对不起,我没有明白你的想法,为什么它更像 django... 你是在建议我在每个 url 中都加上前缀?
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我认为可以,但是如何解决{% url some_named_url %} 产生Reverse for 'some_named_url' with arguments '()' and keyword arguments '{}' not found. 的后果性问题?非常感谢!!!
    • 在我的脑海中,2个选项:a)编写自己的url标签和reverse实现; b)摆脱 apache 重写并让您的中间件直接根据主机子域确定租户,然后您将发出 /app1/news/latest/ 之类的 URL,浏览器将针对正确的子域解析这些 URL。 b) 对我来说听起来更好,但我可能错过了一些问题。
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 2021-12-11
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多