2012-10-28 4 views
1

나는 webapp2가 처리기의 get() 메소드로 전송되기 전에 utf-8로 모든 라우트 된 매개 변수를 자동으로 디코딩하도록 만들고있다. 모든 핸들러가 상속 한 BaseHandler 클래스에서 dispatch()를 재정의하려했지만 요청 객체를 통해 매개 변수를 읽지 만 변경하지는 않았습니다. 이걸 내가 어떻게하면 좋을까?라우팅 된 모든 매개 변수에 대해 핸들러를 자동으로 작성하려면 어떻게합니까 ('utf-8')?

편집

내 나쁜, 이것은 기존의 GET-매개 변수에 대한 것이 아니라, URL 키워드 인수로 핸들러의 GET() 메소드를 받게되며 오히려 라우팅 된 부품. 일치하는 URL의 유니 코드 문자가 포함되어 있으면 .decode ('utf-8') 여야하며 그렇지 않으면 유니 코드 오류가 발생합니다. 내 시스템의 모든 처리기와 라우팅 된 매개 변수에 대해 이러한 디코딩을 수동으로 수행하지 않아도됩니다.

+0

이보고 된 문제보기 : http://code.google.com/p/webapp-improved/issues/detail?id=50 – voscausa

+0

감사합니다. 그러나 이것은 실제로 GET 매개 변수가 아니라 URL 처리기의 get() 메서드가 키워드 인수로받는 URL의 라우트 된 부분이 아니라는 것을 깨달았습니다. 그에 따라 내 질문이 업데이트되었습니다. – Aneon

답변

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 

, 단지 당신이 인수를 디코딩 할 모든 방법을 장식하기 위해 이것을 사용 디코딩은 완전히 자동으로 처리됩니다.

다른 핸들러에서 상속하고 다음 코드를 추가하려면 기본이되는 핸들러 클래스의 파견() 메소드를 오버라이드 (override)

: webapp2 개발자에게

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 버전의 기능, 프레임 워크에 의해 자동으로 처리되어야하거나, 설정을 통해 처리되어야하는 것처럼 보입니다.

1

이렇게하는 한 가지 방법은 데코레이터를 사용하는 것입니다. 그것은 완전히 자동 아니지만, 그것은 또한 더 명시 적입니다 :

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

감사합니다. Nick! webapp2에서 더 많은 내용을 읽은 후에는 (더 명확하지는 않지만) 자동으로 더 많은 작업을 수행하는 또 다른 방법을 발견했습니다. 내 주요 게시물을 편집하고 거기에 코드를 포함합니다. – Aneon

+1

@Aneon 답변을 제공 할 경우 자신의 질문에 대한 대답으로 게시하고 수락해야합니다. –

+0

완료. 고맙습니다. – Aneon