【问题标题】:Achieve different behaviour when accessing from other domain从其他域访问时实现不同的行为
【发布时间】:2014-07-30 20:56:56
【问题描述】:

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

我知道我必须对网络服务器进行一些更改,这不是问题。我的问题集中在如何使用 Django 完成此任务。

有一个叫做Django sites 的东西可能对此有用,但我不确定这对于这样一个“简单”的东西是否是一个过度杀伤的功能。但是我知道需要进行多项更改(路径、cookie 域等),所以...这是推荐的方法吗?

【问题讨论】:

    标签: python django cross-domain


    【解决方案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?

    【讨论】:

      猜你喜欢
      • 2015-10-18
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多