我在Django中有一个RedirectView,它从数据库中读取要重定向到的URL。 我不会控制给出哪个URL,除了它确实是一个有效的URL。
当数据库中保留的URL具有以下格式时,会出现问题:
http://www.example.com/example?q=http%3A%2F%2Fwww.google.com
您可能会注意到该网址包含"引用"到代表%3A%2F%2F
的{{1}}。
问题是,在将://
设置为此值后,RedirectView会执行其self.url
方法并在此行上抛出异常:
dispatch
抛出的异常是:
url = self.url % kwargs
我认为这是因为python尝试将url格式化为字符串并且无法处理ValueError: unsupported format character 'A' (0x41) at index 39
。但我不确定..
现在,%
dict是空的,似乎解决问题的是#34; unquoting"使用kwargs
urllib
方法执行调度之前的网址,该方法会将unquote
转换回字符串中的%3A%2F%2F
。
这解决了这个问题,但我想知道是否还有更多" pythonic"处理这个问题的方法,如果这确实是造成问题的原因。
谢谢!
答案 0 :(得分:0)
我建议不要对字符串进行de-urlencoding,而是将%
转义为%%
以便与printf
一起使用 - 就像字符串格式化一样,在我看来这更清晰。但是,如果您需要支持基本URL中的参数,这可能会变得棘手。您需要逐个提取它们并检查它是否是URL编码的字符或%
格式参数。