向请求添加数据
Django 使得在视图中使用请求添加额外数据变得非常容易。例如,我们可以解析请求的 META 上的子域,并使用中间件将其作为请求的单独属性附加。
class SubdomainMiddleware:
def process_request(self, request):
"""
Parse out the subdomain from the request
"""
host = request.META.get('HTTP_HOST', '')
host_s = host.replace('www.', '').split('.')
request.subdomain = None
if len(host_s) > 2:
request.subdomain = host_s[0]
如果你将中间件数据添加到请求中,则可以进一步访问新添加的数据。在这里,我们将使用已解析的子域来确定组织正在访问你的应用程序的内容。此方法对于使用带有通配符子域的 DNS 设置部署的应用程序非常有用,这些子域都指向单个实例,访问该应用程序的人员希望蒙皮版本依赖于访问点。
class OrganizationMiddleware:
def process_request(self, request):
"""
Determine the organization based on the subdomain
"""
try:
request.org = Organization.objects.get(domain=request.subdomain)
except Organization.DoesNotExist:
request.org = None
请记住,当中间件彼此依赖时,顺序很重要。对于请求,你需要将依赖中间件放在依赖项之后。
MIDDLEWARE_CLASSES = [
...
'myapp.middleware.SubdomainMiddleware',
'myapp.middleware.OrganizationMiddleware',
...
]