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



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

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

有一种叫做Django站点的东西可能对此很有用,但我不确定对于这样一个"简单"的事情来说,这是否是一个过分的功能。然而,我知道需要进行多次更改(路径,cookie域等),所以……这是推荐的做法吗?

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

直接从模板检查HTTP_HOST

一个非常简单的方法是从模板检查请求。元字典中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,这将是很好的。

<标题>自定义中间件h1> 一种选择是创建自定义中间件并从那里检查相同的对象。过程基本相同但你可能想在请求对象 上设置一个额外的键

在某个文件…志愿者项目/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

在你的设置。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/

使用站点框架

使用sites框架只有当你启用了它(django.contrib.sites)才有效,它不再是默认的,对于你的目的来说是多余的。你可以从这个答案中看到一个如何工作的例子:我怎么能得到我的网站在Django模板的域名?

相关内容

  • 没有找到相关文章

最新更新