我怎样才能得到完整/绝对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_IDconfiguration的站点对象。 有关使用网站框架的文档,请阅读更多信息

例如

 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 ,让你用fullurlfullstatic代替urlstatic模板标签,就像这样:

 {% load fullurl %} Absolute URL is: {% fullurl "foo:bar" %} Another absolute URL is: {% fullstatic "kitten.jpg" %} 

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

的PyPI 特拉维斯CI

在视图中,您当然可以使用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() 

这对我来说工作得很好,

我不完全确定它是如何工作的。 我相信这是一个更低的水平,并将返回您的服务器主机名,这可能不同于您的用户使用您的主机名到您的网页。