根据网址中的域名动态设置settings.py中的SIDE_ID有什么好方法?
我的应用程序将运行太多域名(基于城市),每个域的自定义settings.py文件都无法使用。
有没有办法动态设置它?
答案 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