我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!
我想使用reverse()。
我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!
我想使用reverse()。
当前回答
试试下面的代码:
{{ request.scheme }}://{{ request.META.HTTP_HOST }}
其他回答
你可以试试"request.get_full_path()"
我明白了:
wsgiref.util.request_uri(request.META)
获取包含模式、主机、端口路径和查询的完整uri。
在你看来,只需这样做:
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}}
如果你不想访问数据库,你可以通过设置来实现。然后,使用上下文处理器将其添加到每个模板:
# 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>