向请求添加数据

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',
    ...
]