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

我想使用reverse()。


当前回答

不是绝对的url,但我正在寻找只是得到主机。如果你想在view.py中获得host,你可以这样做

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

其他回答

如果你不想访问数据库,你可以通过设置来实现。然后,使用上下文处理器将其添加到每个模板:

# settings.py (Django < 1.9)
...
BASE_URL = 'http://example.com'
TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.extra_context',
)
# settings.py (Django >= 1.9)
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # Additional
                'myapp.context_processors.extra_context',
            ],
        },
    },
]

# myapp/context_processors.py
from django.conf import settings

def extra_context(request):
    return {'base_url': settings.BASE_URL}

# my_template.html
<p>Base url is {{ base_url }}.</p>

在你看来,只需这样做:

base_url =  "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)

不是绝对的url,但我正在寻找只是得到主机。如果你想在view.py中获得host,你可以这样做

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

在请求时使用方便的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'

我知道这是一个老问题。但我认为人们仍然经常遇到这种情况。

有几个库可以补充Django的默认功能。我试过一些。当反向引用绝对url时,我喜欢以下库:

https://github.com/fusionbox/django-absoluteuri

另一个我喜欢的是,因为你可以很容易地把域、协议和路径放在一起:

https://github.com/RRMoelker/django-full-url

这个库允许你在模板中简单地写你想要的东西,例如:

{{url_parts.domain}}