【发布时间】:2011-05-04 21:16:43
【问题描述】:
如何使用 Django 获取主机服务器的名称?
我需要托管服务器的名称而不是客户端名称?
【问题讨论】:
-
我不敢相信这个过程在 Dj 中如此复杂。
如何使用 Django 获取主机服务器的名称?
我需要托管服务器的名称而不是客户端名称?
【问题讨论】:
为了获得我的 django 服务器名称,我尝试了这个
host = f"{ request.scheme }://{ request.META.get('REMOTE_ADDR') }"
【讨论】:
REMOTE_ADDR 通常是客户端的 IP 地址。唯一会成为主机服务器的情况是请求是从 localhost 发出的。
request.get_raw_uri() # example https://192.168.32.181:10555/
【讨论】:
【讨论】:
如果你有一个请求对象,你可以使用这个函数:
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()}/"?
基本上,您可以在视图/视图集中使用request.get_host()。它返回<ip:port>
【讨论】:
只需添加到@Tobu's answer。 如果你有一个请求对象,并且你想知道协议(即http / https),你可以使用request.scheme(如@RyneEverett's comment所建议的那样)。
或者,您可以这样做(下面的原始答案):
if request.is_secure():
protocol = 'https'
else:
protocol = 'http'
因为如果使用 HTTPS 发出请求,is_secure() 将返回 True。
【讨论】:
试试os.environ.get('HOSTNAME')
【讨论】:
如果您有请求(例如,这是在视图中),您可以查看 request.get_host(),它会为您提供完整的 locname(主机和端口),如果有的话,请考虑反向代理标头。如果您没有请求,则应在设置中的某处配置主机名。在很多情况下,仅查看系统主机名可能会产生歧义,虚拟主机是最常见的。
【讨论】:
request.get_raw_uri() 完成了这项工作,因为它还提供了 http(s) 协议。虽然这是在 Django 3 中,但不确定何时引入。
我一般会在settings.py:
import socket
try:
HOSTNAME = socket.gethostname()
except:
HOSTNAME = 'localhost'
【讨论】: