从其他域访问时实现不同的行为

时间:2014-06-10 07:23:45

标签: python django cross-domain

我有一个运行Django的网站,其主要域名是example.com。我想要实现的是当用户从example2.com访问时(特别是加载自定义CSS),以不同的方式行事。

我知道我必须对Web服务器进行一些更改,这不是问题。我的问题集中在如何使用Django实现这一目标。

有一些名为Django sites的东西可能会对此有用,但我不确定这对于这样一个简单的"是否是一种过度的功能。事情。但是我知道需要进行多项更改(路径,cookie域等),所以...这是推荐的方法吗?

1 个答案:

答案 0 :(得分:1)

这是一件非常简单的事情。你有几个不同的选择。

直接从模板

检查HTTP_HOST

一个非常简单的方法是从模板中检查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?