Tornado请求处理程序映射到国际字符

2024-09-19 23:39:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够匹配一些国际化字符的URL请求,比如/Comisión。这是我的设置:

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [ 
            '''some handlers, and then this: '''
            (r"/([\w\:\,]+)", InternationalizedHandler)
            ]
            tornado.web.Application.__init__(self, handlers, **settings)

但是在龙卷风中设置地点似乎不是正确的解决方案。如何设置正则表达式来捕获诸如é、å、µ等字符。?在python中更改re模式可以吗?在


Tags: andselfweburlapplicationinithandlersdef
2条回答

如果你看这里,你会看到你的表达式“意思”:http://regex101.com/r/zO9zC8

如果要匹配é,å,µ,则需要匹配a-zA-Z0-9的逆,即[^a-zA-Z0-9]。鉴于您之前是如何使用\w,您也可以使用与[^\w]相同的\W。在

祝你好运!在

编辑: 重读你的问题,我建议你按照@stemas的答案来做。在

TL;DR:使用Tornado的内置路由器是不可能的。在

Tornado将处理程序模式的regexp编译隐藏得很深,因此@stema建议使用re.Unicode标志是很困难的,因为它不清楚在哪里传递标志。有两种方法可以解决这个问题:子类URLSpec并重写__init__函数,或者在模式中添加一个标志前缀。在

第一个选择是大量的工作。第二个选项利用Python的re模块中的一个特性,其中模式可以在模式的开头指定(?u),而不是将re.UNICODE标志作为参数传递。在

不幸的是,这两个选项都不起作用,因为Tornado在将请求URL解码为unicode字符串之前,会根据URL匹配模式。因此,使用Unicode标志编译模式没有任何效果,因为您是根据百分比编码的ASCII url而不是Unicode字符串进行匹配。在

相关问题 更多 >