如何在Django without the Sites module中获取完整/绝对URL(例如 https://example.com/some/path
)?那个_1439566需要查询我的数据库以获取URL!
我想用 reverse()
来使用它 .
如何在Django without the Sites module中获取完整/绝对URL(例如 https://example.com/some/path
)?那个_1439566需要查询我的数据库以获取URL!
我想用 reverse()
来使用它 .
17 回答
根据请求使用方便的request.build_absolute_uri()方法,将相关网址传递给它,它会给你一个完整的方法 .
默认情况下,返回
request.get_full_path()
的绝对URL,但您可以将相对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
,则默认为您在settings.py中使用SITE_ID
配置的站点对象 . 在using the sites framework的文档中阅读更多内容例如
它不像
request.build_absolute_url()
那样紧凑/整洁,但是当请求对象不可用时,它是可用的,并且您有一个默认的站点URL .如果您无法访问
request
,则无法在此处的某些解决方案中使用get_current_site(request)
. 您可以使用本机站点框架和get_absolute_url
的组合 . 在管理员中设置至少一个Site,确保您的模型具有get_absolute_url()方法,然后:https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
如果您不想访问数据库,可以使用设置进行操作 . 然后,使用上下文处理器将其添加到每个模板:
django-fullurl
如果你're trying to do this in a Django template, I'已经发布了一个小的PyPI包django-fullurl,让你用
fullurl
和fullstatic
替换url
和static
模板标签,如下所示:这些徽章应该有希望自动保持最新:
在视图中,您当然可以使用request.build_absolute_uri .
要从模板创建指向其他页面的完整链接,您可以使用以下命令:
request.META.HTTP_HOST给出主机名,url给出相对名称 . 然后模板引擎将它们连接成一个完整的URL .
检查进来的
Request.META
字典 . 我认为它有服务器名称和服务器端口 .还有另一种方式 . 您可以在
view.py
中使用build_absolute_uri()
并将其传递给模板 .view.py
your-template.html
在您看来,只需这样做:
我知道这是一个老问题 . 但我认为人们仍然会遇到这种情况 .
有几个库可以补充默认的Django功能 . 我试了几个 . 反向引用绝对URL时,我喜欢以下库:
https://github.com/fusionbox/django-absoluteuri
我喜欢的另一个因为你可以轻松地将域,协议和路径放在一起是:
https://github.com/RRMoelker/django-full-url
这个库允许您简单地在模板中写下您想要的内容,例如:
请尝试以下代码:
如果您正在使用django REST框架,则可以使用
rest_framework.reverse
中的反向函数 . 这与django.core.urlresolvers.reverse
具有相同的行为,除了它使用请求参数来构建完整的URL .编辑仅在REST框架中提及可用性
我知道了:
使用模式,主机,端口路径和查询获取完整的uri .
request.get_host()
会给你域名 .你可以尝试“request.get_full_path()”
您还可以使用:
这对我来说很好,
我不完全确定它是如何工作的 . 我相信这是一个更低级别,并将返回您的服务器主机名,这可能与您的用户用于访问您的页面的主机名不同 .