如何在所有路由参数上自动创建处理程序.decode('utf-8')?

时间:2012-10-28 23:35:25

标签: python google-app-engine webapp2

我正在尝试让webapp2自动将所有路由参数解码为utf-8,然后再将它们发送到其处理程序的get()方法。我试图在所有处理程序继承的BaseHandler类中覆盖dispatch(),但我只是设法通过请求对象读取参数,而不是更改它们。我最好怎么做到这一点?

修改

我的不好,这不是传统的GET参数,而是处理程序的get()方法接收为关键字参数的URL的路由部分。当它们包含匹配的URL中的unicode字符时,它们必须是.decode('utf-8'),否则它们将给出UnicodeDecodeError。我想避免为我的系统中的每个处理程序和路由参数手动执行这些解码。

2 个答案:

答案 0 :(得分:2)

这是我解决的解决方案,因为解码是完全自动处理的。

覆盖其他处理程序继承的基本处理程序类的dispatch()方法,并将以下代码添加到其中:

route_kwargs_decoded = {}
for key, value in self.request.route_kwargs.iteritems():
    route_kwargs_decoded[key] = value.decode('utf-8')
self.request.route_kwargs = route_kwargs_decoded

对于webapp2开发人员,我认为在未来的webapp2版本中将其作为一项功能实施可能是值得考虑的,因为它似乎应该由框架自动处理,或者至少通过设置来处理。

答案 1 :(得分:1)

一种方法是使用装饰器。它不是完全自动的,但它也更明确:

def decode_utf8(inner):
  def func(self, *args, **kwargs):
    args = [x.decode('utf8') for x in args]
    kwargs = dict((k, v.decode('utf8')) for k, v in kwargs.items())
    return inner(self, *args, **kwargs)
  return func

然后,只需使用它来装饰你想要解码参数的任何方法:

class MyHandler(webapp2.RequestHandler):
  @decode_utf8
  def get(self, foo, bar):
    #...