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

2024-04-20 13:46:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

有一个叫做Django sites的东西可能对这很有用,但我不确定这对于这样一个“简单”的东西来说是否是一个杀伤力过大的特性。但是我知道需要多个更改(路径、cookies域等),所以。。。这是推荐的方法吗


Tags: django用户路径comweb网站example方式
1条回答
网友
1楼 · 发布于 2024-04-20 13:46:58

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

直接从模板检查httpu主机

一种非常简单的方法是从模板检查request.META dictionary的HTTP\u主机密钥值

{# 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 %}

这是一项更复杂的工作,而且基本上也做了同样的事情,但是您可以很容易地应用一些额外的测试来查看您是处于调试模式还是仅仅访问overlocalhost:8000 and 仍然将示例2设置为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?

相关问题 更多 >