向請求新增資料

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