Django-rest-framework: 在可浏览的API URL中转义(“&”号)。

创建于 2014-06-20  ·  26评论  ·  资料来源: encode/django-rest-framework

当在可浏览的API中呈现带有转义字符(在我的情况下,特别是和符号)的URL时,在href中将其不正确地转义。 这可能仅适用于“&”号。

例如,此URL:
http:// localhost :8000 / endpoint /?param1 =是+%26 +否&param2 =某些

将呈现为:
http:// localhost :8000 / endpoint /?param1 =是+&+否&param2 =某些东西

URL正确显示在a元素的值中……这仅适用于href。

最有用的评论

我只想确认它现在可以正常工作了:)

喜欢这个库,它已经可以很好地运行了,但是即使到那时它仍然会变得更好! 👍

所有26条评论

抱歉,反应迟钝。
只是不同的呈现方式还是源HTML本身未转义?

嗨,汤姆,在HTML中看起来像这样:

<a href="http://localhost:8000/endpoint/?param1=Yes+&+No&param2=something">http://localhost:8000/endpoint/?param1=Yes+%26+No&param2=something</a>

太感谢了-为此可能值得尝试编写一个失败的测试用例。
理想情况下,这只会行使BrowsableAPIRendererer ,但对于完整的集成测试也可能没问题。

当然,我很乐意。 现在浏览测试套件...合适的位置应该在test_renderers.py的RendererEndToEndTests中吗?

听起来还可以。

这与DRF的urlize_quoted_links调用的Django的smart_urlquote urlize_quoted_links ,后者是在可浏览API中处理转换的原因。 我_认为链接文本和链接本身之间的区别可能是Django的转义内容,但老实说我不确定那里是否存在。

smart_urlquotequote之前调用unquote quote ,这会剥离原始的。 这是在https://github.com/django/django/commit/b70c371fc1f18ea0c43b503122df3f311afc7105中添加的,并已反向移植到Django 1.5+。

那么,我们是否在乎这不是客户会看到的,或者我们只是将其关闭?
从语义上讲,这仍然是正确的。

将其从bug推送到清理,因为这是边界。

DjangoCon指南-该票证的一般审阅-您希望行为如何,可以接受吗?

我在django-con sprint上,可以进行此工作。 我之前没有贡献过,所以我可能需要一些初步指导。 我目前正在阅读DRF的贡献者指南,在本地运行测试后,我可能会亲自或在irc上与某人打交道。

需要注意的地方-请随时在IRC上ping我,如果我在那儿没有响应,请使用Twitter。

由于优先级低和缺乏进展而关闭。
很高兴重新考虑是否有人愿意再次考虑这一点。

@tomchristie我知道这是一个小问题,但这仍然是一个错误。 如果您单击链接,它将转到错误的URL。 标记为低优先级似乎比结束有效问题更为合适。

有空的时候我会调查一下。

抱歉,我对此有不同的理解-URL没错,只是它以未转义的样式呈现了链接,我是否误解了?

IE。 cleanup标签的原因,了解这是一个装饰性问题?

哦,我懂了。 对,那是正确的。 基本上,href和显示值都被转义,而不仅仅是显示值。

谢谢你这么好的图书馆,顺便说一句!

对不起,再说一次:)

对,那是正确的。

更正这是一个表面问题,还是更正我误解了,这是一个错误? :)

更正这是一个错误。 :)

关闭,因为这已通过https://code.djangoproject.com/ticket/22267修复

还没有看过这个,但是如果我们重复“ urlize”,我们是否还需要做其他事情? 还解决了什么版本? 而且,太好了! 耶!

在1.7.1中似乎未解决此问题,所以1.7.2或1.8? 这是我在Django 1.7.1中看到的行为:

>>> from django.utils.html import smart_urlquote, escape
>>> escape(smart_urlquote('http://qwerty.com'))
u'http://qwerty.com'
>>> escape(smart_urlquote('http://qwerty.com?blah=Yes+%26+No'))
u'http://qwerty.com?blah=Yes+&amp;+No'

..和django master分支的现任负责人:

>>> from django.utils.html import smart_urlquote, escape
>>> escape(smart_urlquote('http://qwerty.com?blah=Yes+%26+No'))
u'http://qwerty.com?blah=Yes+%26+No'

urlize_quoted_links最初是django.utils.html.urlize的修改副本吗? https://github.com/django/django/blob/master/django/utils/html.py#L255 -L352明显不同,但我不能说出单独版本的原因。 似乎需要重新复制。

是的,它已经被复制了,因为原始格式不适用于包含单引号或双引号的“ http://example.org ”样式链接,并且没有简单的替代方法可以允许它。 如果存在很大差异,则可能是由于Django版本的逐步更改而我们的版本保持不变。

要重新打开此文件以确保我们有一个占位符票证,以确保得到解决。

由于存在更高优先级的3.0.1项,因此删除了此里程碑。

我想知道是否有可能从#2014中提取失败的测试用例

此评论https://github.com/tomchristie/django-rest-framework/pull/2014#issuecomment -61525348表示该问题已在上游Django中修复。 关闭此功能,但如果有人确认仍然存在问题,它将重新打开。

我只想确认它现在可以正常工作了:)

喜欢这个库,它已经可以很好地运行了,但是即使到那时它仍然会变得更好! 👍

此页面是否有帮助?
0 / 5 - 0 等级