【问题标题】:How to use Django to get the name for the host server?如何使用 Django 获取主机服务器的名称?
【发布时间】:2011-05-04 21:16:43
【问题描述】:

如何使用 Django 获取主机服务器的名称?

我需要托管服务器的名称而不是客户端名称?

【问题讨论】:

  • 我不敢相信这个过程在 Dj 中如此复杂。

标签: python django url host


【解决方案1】:

为了获得我的 django 服务器名称,我尝试了这个

host = f"{ request.scheme }://{ request.META.get('REMOTE_ADDR') }"

【讨论】:

  • REMOTE_ADDR 通常是客户端的 IP 地址。唯一会成为主机服务器的情况是请求是从 localhost 发出的。
【解决方案2】:
request.get_raw_uri() # example https://192.168.32.181:10555/

【讨论】:

  • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
【解决方案3】:

如果您需要获取http(s)://hostname/,您可以使用以下方式:

request.build_absolute_uri('/')

所有有用的方法都列出了here

【讨论】:

    【解决方案4】:

    如果你有一个请求对象,你可以使用这个函数:

    def get_current_host(self, request: Request) -> str:
        scheme = request.is_secure() and "https" or "http"
        return f'{scheme}://{request.get_host()}/'
    

    【讨论】:

    • 有什么理由不把它简化成f"{request.scheme}://{request.get_host()}/"
    • 来自文档:表示请求方案的字符串(通常为 http 或 https)。所以这可能会更容易。
    【解决方案5】:

    基本上,您可以在视图/视图集中使用request.get_host()。它返回<ip:port>

    【讨论】:

      【解决方案6】:

      只需添加到@Tobu's answer。 如果你有一个请求对象,并且你想知道协议(即http / https),你可以使用request.scheme(如@RyneEverett's comment所建议的那样)。

      或者,您可以这样做(下面的原始答案):

      if request.is_secure():
          protocol = 'https'
      else:
          protocol = 'http'
      

      因为如果使用 HTTPS 发出请求,is_secure() 将返回 True

      【讨论】:

      • 你不能用request.scheme吗?
      • @RyneEverett 谢谢。不知道(捂脸)。
      【解决方案7】:

      试试os.environ.get('HOSTNAME')

      【讨论】:

      • 使用这个时,要注意有些发行版只设置了HOST,而另一些只设置了HOSTNAME,而且很多export默认都没有。
      【解决方案8】:

      如果您有请求(例如,这是在视图中),您可以查看 request.get_host(),它会为您提供完整的 locname(主机和端口),如果有的话,请考虑反向代理标头。如果您没有请求,则应在设置中的某处配置主机名。在很多情况下,仅查看系统主机名可能会产生歧义,虚拟主机是最常见的。

      【讨论】:

      • 如果我没有请求,我需要在设置变量中硬编码域名吗?
      • 对我来说 request.get_raw_uri() 完成了这项工作,因为它还提供了 http(s) 协议。虽然这是在 Django 3 中,但不确定何时引入。
      【解决方案9】:

      我一般会在settings.py

      import socket
      
      try:
          HOSTNAME = socket.gethostname()
      except:
          HOSTNAME = 'localhost'
      

      【讨论】:

      • 如果您使用 Docker,您的解决方案将不起作用。它将显示容器 ID 而不是 URL。
      • 他的解决方案是在 docker 出现之前编写的。对不起。
      • @antony.trupe 来自模因?
      • 有人删除了我 2016 年 11 月 22 日的评论,内容如下:我的解决方案是在 Docker 出现之前编写的。对不起。
      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 2014-08-09
      • 1970-01-01
      • 2020-08-13
      • 2013-03-27
      • 2011-06-16
      • 1970-01-01
      • 2014-06-15
      相关资源
      最近更新 更多