为了易于使用,Django编译了一个页面,其中包含可以完成此操作的每个可能的现有django软件包。但是下面是我自己的简单实现
我修改了我的nginx代理配置以使用以下内容
server_name ~(?<short_url>w+).domainurl.com$;... stuff related to static files herelocation / { 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 companyatest.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)



