我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!

我想使用reverse()。


当前回答

在做一个项目的时候,我学会了在Django中获取完整/绝对的URL。

如果你的URL在地址栏中是这样的:

https://stackoverflow.com/questions/2345708

如果你想把上面的URL显示给你的模板。

{{请求。不带GET参数。 {{请求。get_full_path}} #带有GET参数

对于上面的两个代码,这将打印在你的模板中

questions/2345708

另一种获取完整URL的方法是:

{{request.build_absolute_uri}}

这将打印在你的模板将是:

https://stackoverflow.com/questions/2345708

其他回答

我明白了:

wsgiref.util.request_uri(request.META)

获取包含模式、主机、端口路径和查询的完整uri。

在请求时使用方便的request.build_absolute_uri()方法,将相对url传递给它,它会给你一个完整的url。

默认情况下,返回request.get_full_path()的绝对URL,但您可以将相对URL作为第一个参数传递给它,以将其转换为绝对URL。

>>> request.build_absolute_uri()
'https://example.com/music/bands/the_beatles/?print=true'
>>> request.build_absolute_uri('/bands/?print=true')
'https://example.com/bands/?print=true'

要从模板创建到另一个页面的完整链接,您可以使用以下命令:

{{ request.META.HTTP_HOST }}{% url 'views.my_view' my_arg %}

request.META。HTTP_HOST给出主机名,url给出相对名。然后模板引擎将它们连接成一个完整的url。

还有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()

子类化它,现在你可以在任何地方使用它。

django-fullurl

如果你想在Django模板中这样做,我已经发布了一个小的PyPI包Django -fullurl,让你用fullurl和fullstatic替换url和静态模板标签,就像这样:

{% load fullurl %}

Absolute URL is: {% fullurl "foo:bar" %}

Another absolute URL is: {% fullstatic "kitten.jpg" %}

这些徽章应该自动保持最新:

在视图中,当然可以使用request。build_absolute_uri代替。