Html Django模板视图,以防止用户定义的相对url
在Html Django模板视图,以防止用户定义的相对url,html,django,Html,Django,在Django模板中,我呈现存储在数据库中的URL。此URL由用户定义。我不喜欢的是,用户定义了一个相对URL,比如/admin,并重定向到当前服务器域中不相关的地方。有没有办法防止bookmark.url被呈现为相对url?我希望它仅渲染为绝对路径 <div> <a href="{{ bookmark.url }}">{{ bookmark.name }}</a> </div> 注1:{%get\u static\u prefix%
Django
模板中,我呈现存储在数据库中的URL。此URL由用户定义。我不喜欢的是,用户定义了一个相对URL,比如/admin
,并重定向到当前服务器域中不相关的地方。有没有办法防止bookmark.url
被呈现为相对url?我希望它仅渲染为绝对路径
<div>
<a href="{{ bookmark.url }}">{{ bookmark.name }}</a>
</div>
注1:{%get\u static\u prefix%}
看起来与我的问题无关。请避免链接到这些问题。(以防万一)
注意2:我正在寻找模板视图端的任何解决方案或HTML解决方案。我知道在将模型对象作为
上下文发送之前修改它总是可能的。但是,我并不追求这样的解决方案。另外,我也不喜欢在视图中添加if-else,因为它对于这样一个小的改进来说太难了。下面的自定义标记应该可以工作
from urllib.parse import urljoin
@register.simple_tag(takes_context=True)
def absolute_url(context, url):
return urljoin(context.request.build_absolute_uri(), url)
将完全限定URL和相对路径转换为完全限定URL,路径替换为右手参数
>>> urllib.parse.urljoin('http://somewebsite.com/foo/bar/', '/hello')
'http://somewebsite.com/hello'
但是如果右边的参数已经是一个完全限定的URL,它将返回该URL
>>> urllib.parse.urljoin('http://somewebsite.com/foo/bar/', 'http://someotherwebsite.com/')
'http://someotherwebsite.com/'
然后,当您加载了自定义标记后,您可以像这样使用它
<a href="{% absolute_url bookmark.url %}">
不清楚这将如何解决您的问题。用户不能将URL定义为http://example.com/admin
?@Selcuk,是的。任何绝对URL都可以。我希望URL被呈现为绝对的,而不是相对的。有(也不能)一种内置的方式。在这种情况下,您可以考虑编写自己的模板标签。在URL文件中,您需要确保在该视图之前添加管理员。秩序很重要。你还需要建立一个你不想发生的URL黑名单,当用户试图创建它时,它不允许这样做。此外,如果提供的url是从您的站点发送的,请确保验证它是否是正确的url。是否要在呈现时将相对url转换为绝对url?即使绝对URL在应用程序中的其他地方?