Django - Url模式正则表达式不匹配字符串参数和重音符号

时间:2012-07-27 20:37:01

标签: python django

我在使用重音符向Django应用程序传递字符串参数时遇到了一些麻烦。我有以下网址格式:

url(r'^galeria/(?P<page>\d+)/(?P<order>\w+)/(?P<query>[\w|\W]+)', 'possible_brastemp.views.gallery_with_page_and_query'),

当我尝试一个网址时:

 http://127.0.0.1:8000/galeria/1/ultimos/Julian%20Andr%E9s

模式不匹配。我已将问题隔离到'%E9'字符('%20'不会破坏匹配)。

如何更改正则表达式以匹配带编码字符的参数?

谢谢

1 个答案:

答案 0 :(得分:4)

在网址中使用%c3%a9代替%e9。正则表达式没有失败...... Django甚至没有进入urlconf。检查日志,你可能会得到400个错误。

URI路径应仅包含UTF-8编码的字符。任何UTF-8字符都不能表示为普通的可打印ASCII字符(并且不在保留列表中),应该进行百分比编码。

é(U + 00E9)是UTF-8中的多字节字符:0xc3a9。百分比编码形式为%C3%A9。单字节0xe9不是有效的UTF-8字符。

请参阅RFC 3986

[\w|\W]+成功匹配包含%C3%A9的网址。 Django似乎将URL字节字符串百分比解码为Unicode字符串,然后将其转换为UTF-8以进行urlconf匹配。