2017-10-18 11 views
1

이전에 명확하지 않았기 때문에 제 질문을 편집했습니다.webapp2 tuple (regex, handler)를 사용하여 핸들러를 요청하십시오.

코드 1 작동

class AtSeaHandler(webapp2.RequestHandler): 
    def get(self, id=None): 
     boat = ndb.Key(urlsafe=id).get() 
     boat_dict = boat.to_dict() 
     boat_dict['self'] = "/boats/" + id 
     self.response.write(json.dumps(boat_dict) 

app = webapp2.WSGIApplication([ 
     ('/boats/([\w-]+)', AtSeaHandler) 
     ], debug=True) 

코드 2 (작동하지 않음)

class AtSeaHandler(webapp2.RequestHandler): 
    def get(self, id=None): 
     boat = ndb.Key(urlsafe=id).get() 
     boat_dict = boat.to_dict() 
     boat_dict['self'] = "/boats/" + id 
     self.response.write(json.dumps(boat_dict) 

app = webapp2.WSGIApplication(
     ('/boats/([\w-]+)/at_sea', AtSeaHandler) 
     ], debug=True) 

코드 (2)는 코드 1 코드 1 및 코드 사이의 유일한 차이의 사본은 2 코드 1은 ('/ 보트/([\ w -] +)', AtSeaHandler) 코드 2는 ('/ 보트/([\ w -] +)/at_sea', AtSeaHandler)입니다. 그런 다음 코드 1을 주석 처리합니다.

코드 1이 작동합니다. 코드 2는/at_sea가 추가 된 상태에서 작동하지 않습니다. 나는 우편 배달부에 http://localhost:8080/boats/aghkZXZ-Tm9uZXIRCxIEQm9hdBiAgICAgPCLCww을 입력하고 코드 1이 작동하는지 확인합니다. 또한 코드 2를 테스트하고 작동하지 않는지 확인합니다.

이 기능을 사용하려면 어떻게해야합니까? boat 엔터티 키를 ([\ w -] +)에 전달하면 I def get(self, id=None):id이 보트 엔터티 키가됩니다. at_sea에 get()에서 인수가 필요합니까? get (self, id = none)에서 get (self, id = none, argument3 = none) get()을 변경해야합니까? C++에서 오면서, 3 인자가있는 함수 호출과 같다고 생각합니다. 3 인자가있는 함수 헤더가 필요합니다. 내가 완전히 오해하고 있니?

documentation 내 질문에 대답하는 방법을 이해하는 도움이되지 않는다 ...

+0

그래, 내 첫번째 의혹은 사실이다 : HTTP를 시도 : // localhost를 : 8080/보트/aghkZXZ-Tm9uZXIRCxIEQm9hdBiAgICAgPCLCww이/at_sea 새로운 패턴을 –

답변

0

할 수 있습니다 항상 핸들러의 get() 코드의 일반적인 접근 방식을 (쉽게 브라우저를 확인할 수 있습니다 whcih)를 사용하여 적격 심사를 수행 의미에서 당신은 app의 라우터에있는 정규식 패턴에 관계없이 작동해야 : 당신은 유사한 방법을 적용 할 수 있도록

def get(self, *args, **kwargs): 
     self.response.write('args: %s<br>kwargs: %s' % (args, kwargs)) 

라우터의 put()에 대해 동일한 방식으로 작동 만이 약간의 결과를 즉시보기가 어렵습니다. 로깅을 사용하고 응용 프로그램의 로그를 확인하십시오.

이 정보를 통해 원하는 arg와 how/where를 정확히 알 수 있으므로 필요에 따라 처리기 코드를 적용 할 수 있습니다. regex 패턴을 변경하면 반복해야 할 수도 있습니다.

게시 한 코드 (예 : def put():)로는 id이 초기화되지 않았으므로 전혀 작동하지 않아야합니다. 즉, 변경 사항을 추적하지 못한 것입니다.

내게는 put(self, id=None):이 맞고 어떤 패턴이든 이면 하나의() 그룹이 있어야합니다.

당신은 정확하게 당신이 stopped working에 의해 뜻하는지 설명하지 않았다 :) 내가이 의심이 :

  • 당신이 패턴과 일치하는 실제 요청을 변경하지 않은합니다. boats/<some_safe_url> 요청은 '/boats/([\w-]+)' 패턴과 일치하지만 '/boats/([\w-]+)/at_sea' 패턴은 실패합니다. 404 오류가 표시됩니다.

  • 귀하는 AtSeaHandler에 대한 요청을 예상했지만 실제로는 BoatHandler에 있습니다 (그리고 아마도 그 사실을 알지 못했을 것입니다). 이는 boats/<some_safe_url>/at_sea 패턴이 '/boats/(.*)' 패턴과 일치하고 라우터가 첫 번째 일치 항목을 선택하기 때문에 발생합니다. 이 예기치 않은 일치는 또한 id : <some_safe_url>/at_sea을 생성하여 키를 얻지 못하고 보트를 잡는 데 실패합니다. 다시 404 오류 또는 일반 오류 (500 오류)가 발생합니다. 라우터의 경로 정의 순서를 가장 구체적인 패턴을 먼저 교환해야합니다.

+0

감사 맞게! 나는 라우팅 순서를 깨닫지 못했고 (. *)는 나에게 문제를 일으켰다. 이제 작동합니다! 내가 온라인으로 봤던 모든 것들은 경로 정의의 순서대로 강조하지 않았고, 나는 (. *)이 뒤 따르는 것을 어떻게 깨달았는지 알지 못했다. . (*) 다음 순서가 실질적으로 I 교체시 작업 ([/ w -] +) ('/ 보트/([\ w -] +)/at_sea'AtSeaHandler)를 \t ('/ 보트/([\ w -] +) ', BoatHandler) – NoobProgrammer