[英]Django multi tenancy
; 博士:有没有办法覆盖reverse
的默认行为?
在我的 Django 项目中,我有很多网址,例如
url(r'^\w+/company/', include("company.urls", namespace="company")),
这允许网址,如
.../companyA/company/
.../companyB/company/
这样我就可以使用自定义中间件来修改请求,以根据使用我的网站的公司来包含一些特定的详细信息
这一切都很好,除了 django 试图用reverse
和{% url .. %}
...
它似乎将/x/company/
作为正则表达式的默认匹配项返回。 因为django.utils.regex_helper
方法next_char
有一个转义映射\\w
映射到x
我已经能够覆盖的url
标记将/x/
替换为正确的公司名称,我想知道是否有类似的事情我可以以相同的方式覆盖reverse
,或者我可以做的任何其他事情来解决这个问题?
以前,我正在使用
url(r'^(?P<company_name>\w+)/company/', include("company.urls", namespace="company"))
但这意味着我必须在每个视图中包含一个参数
def view(request, company_name):
...
以及将它包含在我试图避免的所有其他视图调用中(即使用{% url %}
)。
为了便于使用,Django 将编译后的页面打包,其中包含可以实现此目的的所有可能的现有 django 包。 然而下面是我自己的简单实现
我修改了我的 nginx 代理配置以使用以下内容
server_name ~(?<short_url>\w+)\.domainurl\.com$;
... stuff related to static files here
location / {
proxy_set_header X-CustomUrl $short_url;
.... other proxy settings
}
这样做是在请求标头中创建一个变量,然后可以在 Django 中使用该变量。 然后我在自定义中间件中使用这个变量来扩展请求,并引用模型,允许它在任何地方使用。
class CompanyMiddleware(object):
def process_request(self, request):
if settings.DEBUG:
request.company = CompanyClass.objects.get(id=1)
return None
short_url = request.META.get("HTTP_X_CUSTOMURL")
try:
company = CompanyClass.objects.get(short_url=short_url)
except Model.DoesNotExist:
return HttpResponseBadRequest('Company not found')
request.company = company
return None
例子:
www.companya.domainurl.com # short_url is companya
test.domainurl.com # short_url is test
要在模板中使用它,必须将上下文处理器添加到settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request' # This one in particular
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.