Tl;dr:有没有办法覆盖reverse的默认行为?
在我的django项目中,我有很多urls,例如
url(r'^\w+/company/', include("company.urls", namespace="company")),,它允许使用urls,例如
.../companyA/company/
.../companyB/company/这样,我就可以使用自定义中间件来修改请求,根据公司使用我的站点的情况包括一些特定的细节。
这一切都很好,除了当django试图用reverse和{% url .. %}破译完整的路径时。
它似乎返回/x/company/作为正则表达式的默认匹配。因为django.utils.regex_helper方法next_char有一个转义映射,\w可以映射到x
我能够用正确的公司名称替换url标记覆盖,我想知道是否有类似的事情可以用相同的方式覆盖reverse,或者我可以做什么来解决这个问题?
以前,我用过
url(r'^(?P<company_name>\w+)/company/', include("company.urls", namespace="company"))但这意味着我必须在每个视图中都包含一个参数。
def view(request, company_name):
...此外,还将它包含在我对视图的所有其他调用中(即使用{% url %}),这是我试图避免的。
发布于 2015-06-09 07:53:51
为了便于使用,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
)https://stackoverflow.com/questions/29938338
复制相似问题