Django:根据URL在settings.py中动态设置SITE_ID?

时间:2014-10-30 17:44:29

标签: python django web

根据网址中的域名动态设置settings.py中的SIDE_ID有什么好方法?

我的应用程序将运行太多域名(基于城市),每个域的自定义settings.py文件都无法使用。

有没有办法动态设置它?

2 个答案:

答案 0 :(得分:10)

您可以执行自定义中间件来读取请求并设置SITE_ID。我在我的一个网站上使用此代码:

class SiteMiddleware(object):
    def process_request(self, request):
        try:
            current_site = Site.objects.get(domain=request.get_host())
        except Site.DoesNotExist:
            current_site = Site.objects.get(id=settings.DEFAULT_SITE_ID)

        request.current_site = current_site
        settings.SITE_ID = current_site.id

您应该查看Django关于中间件的文档,了解如何添加自己的中间件。 https://docs.djangoproject.com/en/dev/topics/http/middleware/

答案 1 :(得分:2)

中间件代码形式似乎已更改。当前(Django v3.1)形式的代码(似乎可行):

from django.conf import settings
from django.contrib.sites.models import Site

class DynamicSiteDomainMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        try:
            current_site = Site.objects.get(domain=request.get_host())
        except Site.DoesNotExist:
            current_site = Site.objects.get(id=settings.DEFAULT_SITE_ID)

        request.current_site = current_site
        settings.SITE_ID = current_site.id


        response = self.get_response(request)
        return response