如何在 Django 中构建完整的 URL

han*_*ros 1 django url satchmo

我需要让 django 发送一封包含这样的 URL 的电子邮件

http://www.mysite.org/history/
Run Code Online (Sandbox Code Playgroud)

像这样获得“历史”的地方:

history_url = urlresolvers.reverse('satchmo_order_history')
Run Code Online (Sandbox Code Playgroud)

history_url 是我传递给发送电子邮件的函数的参数,它正确生成“/history/”。但是我如何获得第一部分?(http://www.mysite.org)

编辑 1

这样做有什么错误或不可移植的吗?

history = urlresolvers.reverse('satchmo_order_history')
domain = Site.objects.get_current().domain
history_url = 'http://' + domain + history
Run Code Online (Sandbox Code Playgroud)

Pao*_*tti 5

如果您有权访问HttpRequest实例,则可以使用HttpRequest.build_absolute_uri(location)

absolute_uri = request.build_absolute_uri(relative_uri)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用网站框架获取它:

import urlparse
from django.contrib.sites.models import Site

domain = Site.objects.get_current().domain
absolute_uri = urlparse.urljoin('http://{}'.format(domain), relative_uri)
Run Code Online (Sandbox Code Playgroud)

回复:编辑1

我倾向于使用urlparse.join,因为它在标准库中,并且从技术上讲它是组合 URI 的最 Pythonic 方式,但我认为您的方法也很好。