我怎样才能得到完整/绝对URL(与域)在Django?
与此问题完全相同,但必须有一种方法可以在没有“网站”模块的情况下执行此操作。 这只是愚蠢的…我不应该查询我的数据库来阻止url!
我想用reverse()
来使用它。
根据请求使用方便的request.build_absolute_uri()方法,将它传递给相对的URL,它会给你一个完整的。
默认情况下,会返回request.get_full_path()
的绝对URL,但是您可以将它作为第一个parameter passing给相对URL以将其转换为绝对URL。
如果你想使用reverse()
你可以这样做: request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
您也可以使用get_current_site
作为网站应用程序的一部分( from django.contrib.sites.models import get_current_site
)。 它接受一个请求对象,如果请求为None
,则默认使用SITE_ID
中的SITE_ID
configuration的站点对象。 有关使用网站框架的文档,请阅读更多信息
例如
from django.contrib.sites.shortcuts import get_current_site request = None full_url = ''.join(['http://', get_current_site(request).domain, obj.get_absolute_url()])
它不像request.build_absolute_url()
那么紧凑/整洁,但是当请求对象不可用时它是可用的,并且你有一个默认的站点url。
如果你无法访问request
那么你不能像这里的一些解决scheme中推荐的那样使用get_current_site(request)
。 您可以使用本地站点框架和get_absolute_url
的组合。 在pipe理员中设置至less一个网站 ,确保你的模型有一个get_absolute_url()方法,然后:
>>> from django.contrib.sites.models import Site >>> domain = Site.objects.get_current().domain >>> obj = MyModel.objects.get(id=3) >>> path = obj.get_absolute_url() >>> url = 'http://{domain}{path}'.format(domain=domain, path=path) >>> print(url) 'http://example.com/mymodel/objects/3/'
https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
如果你不想击中数据库,你可以用一个设置来完成。 然后,使用上下文处理器将其添加到每个模板:
# 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>
检查Request.META
字典,我想它有服务器名称和服务器端口。
要从模板创build到另一个页面的完整链接,可以使用以下命令:
{{ request.META.HTTP_HOST }}{% url 'views.my_view' my_arg %}
request.META.HTTP_HOST给出主机名,url给出相对的名字。 模板引擎然后将它们连接成完整的url。
django-fullurl
如果你正在试图在Django模板中这样做,我已经发布了一个小的PyPI包django-fullurl
,让你用fullurl
和fullstatic
代替url
和static
模板标签,就像这样:
{% load fullurl %} Absolute URL is: {% fullurl "foo:bar" %} Another absolute URL is: {% fullstatic "kitten.jpg" %}
这些徽章应该自动保持最新:
在视图中,您当然可以使用request.build_absolute_uri
。
另一种方式。 您可以在您的view.py
使用build_absolute_uri()
并将其传递给模板。
view.py
def index(request): baseurl = request.build_absolute_uri() return render_to_response('your-template.html', { 'baseurl': baseurl })
您-template.html
{{ baseurl }}
我知道这是一个古老的问题。 但我认为人们仍然遇到这一点。
有几个库,补充了默认的Djangofunction。 我已经尝试了几个。 反向引用绝对url时,我喜欢以下库:
https://github.com/fusionbox/django-absoluteuri
另一个我喜欢的因为你可以很容易地把一个域,协议和path放在一起是:
https://github.com/RRMoelker/django-full-url
这个库允许你简单地在你的模板中写下你想要的,例如:
{{url_parts.domain}}
在你看来,只要做到这一点:
base_url = "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
试试下面的代码:
{{ request.scheme }}://{{ request.META.HTTP_HOST }}
如果您使用的是django REST框架,则可以使用rest_framework.reverse
的反向function。 这与django.core.urlresolvers.reverse
具有相同的行为,只是它使用请求参数来构build完整的URL。
from rest_framework.reverse import reverse # returns the full url url = reverse('view_name', args=(obj.pk,), request=request) # returns only the relative url url = reverse('view_name', args=(obj.pk,))
编辑仅在REST框架中提及可用性
我知道了:
wsgiref.util.request_uri(request.META)
获取完整的URI,包括模式,主机,端口path和查询。
request.get_host()
会给你的域名。
你可以尝试“request.get_full_path()”
你也可以使用:
import socket socket.gethostname()
这对我来说工作得很好,
我不完全确定它是如何工作的。 我相信这是一个更低的水平,并将返回您的服务器主机名,这可能不同于您的用户使用您的主机名到您的网页。