gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:02 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

直接从模板检查 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 %}

这是更多的跑腿工作,而且几乎做了同样的事情,但是您可以轻松地应用一些额外的测试来查看您是否处于 Debug模式或只是通过 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?

关于python - 从其他域访问时实现不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24135178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com