我有一个运行Django的网站,其主要域名是example.com。我想要实现的是当用户从example2.com访问时(特别是加载自定义CSS),以不同的方式行事。
我知道我必须对Web服务器进行一些更改,这不是问题。我的问题集中在如何使用Django实现这一目标。
有一些名为Django sites的东西可能会对此有用,但我不确定这对于这样一个简单的"是否是一种过度的功能。事情。但是我知道需要进行多项更改(路径,cookie域等),所以...这是推荐的方法吗?
答案 0 :(得分:1)
这是一件非常简单的事情。你有几个不同的选择。
一个非常简单的方法是从模板中检查request.META字典的HTTP_HOST键的值。
{# Anything other than port 80, HTTP_HOST will also include the port number as well #}
{% ifequal request.META.HTTP_HOST 'example2.com' %}
<!-- your css imports here -->
{% endifequal %}
请记住,这是由客户端设置的,所以如果您正在做任何其他安全敏感的事情,那么这不是使用方法。只是为了加载一些CSS,它会很好。
另一种选择是创建自定义中间件并从那里检查同一个对象。基本上是相同的过程,但您可能想要做一些事情,比如在请求对象上设置额外的密钥
在某个文件中.. yourproject / someapp / middlware.py
class DomainCheckMiddleware(object):
def process_request(self, request):
if request.META['HTTP_HOST'] == "example2.com":
request.IS_EXAMPLE2 = True
else:
request.IS_EXAMPLE2 = False
return None
在你的settings.py
中MIDDLEWARE_CLASSES = (
# whatever middleware you're already loading
# note: your middleware MUST exist in a package that's part of the INSTALLED_APPS
'yourproject.someapp.DomainCheckMiddleware'
)
在您的模板中
{% if request.IS_EXAMPLE2 %}
<!-- load your css here -->
{% endif %}
这是更多的工作,并且几乎做同样的事情,但你可以轻松地应用一些额外的测试,看看你是否处于调试模式或只是访问localhost:8000并仍然将IS_EXAMPLE2设置为true,使您的模板更难以阅读。
这也有前面提到的同样的垮台。
https://docs.djangoproject.com/en/dev/topics/http/middleware/
使用站点框架仅在您启用它(django.contrib.sites)时才有效,默认情况下它不再适用于您的目的。你可以看到一个例子,说明如何从这个答案起作用: How can I get the domain name of my site within a Django template?