我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!
我想使用reverse()。
我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!
我想使用reverse()。
当前回答
你还可以使用:
import socket
socket.gethostname()
这对我来说很好,
我不太清楚它是怎么运作的。我相信这是更低级的,它将返回您的服务器主机名,这可能与您的用户访问您的页面所使用的主机名不同。
其他回答
不是绝对的url,但我正在寻找只是得到主机。如果你想在view.py中获得host,你可以这样做
def my_view(request):
host = f"{ request.scheme }://{ request.META.get('HTTP_HOST') }"
还有ABSOLUTE_URL_OVERRIDES可用作为设置
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
但这将覆盖get_absolute_url(),这可能是不可取的。
我认为更好的解决方案是把它放在models.py中,而不是仅仅为此安装sites框架,或者做一些这里提到的依赖于request对象的其他事情
在settings.py中定义BASE_URL,然后将其导入models.py并创建一个抽象类(或将其添加到您已经在使用的类中),该类定义get_truly_absolute_url()。它可以很简单:
def get_truly_absolute_url(self):
return BASE_URL + self.get_absolute_url()
子类化它,现在你可以在任何地方使用它。
我使用这个代码:
request.build_absolute_uri('/')[:-1]
回应:
https://yourdomain.com
在你看来,只需这样做:
base_url = "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
我知道这是一个老问题。但我认为人们仍然经常遇到这种情况。
有几个库可以补充Django的默认功能。我试过一些。当反向引用绝对url时,我喜欢以下库:
https://github.com/fusionbox/django-absoluteuri
另一个我喜欢的是,因为你可以很容易地把域、协议和路径放在一起:
https://github.com/RRMoelker/django-full-url
这个库允许你在模板中简单地写你想要的东西,例如:
{{url_parts.domain}}