1

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

编辑

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

4

2 回答 2

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 版本中将此作为功能实现,因为它似乎应该由框架自动处理,或者至少通过设置来处理。

于 2012-10-30T21:39:08.610 回答
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):
    #...
于 2012-10-29T14:39:32.033 回答