2017-12-25 42 views
0

라우팅 구현과 함께 토네이도 4.5.2를 사용합니다. 내 서버에는 두 가지 API 버전이 있으며 basefancy으로 전화를 걸 수 있습니다. 그래서 클라이언트는 둘 다 사용할 수 있습니다 :"기본"처리기로 라우팅되는 토네이도

GET /base/foo 
GET /base/baz 

GET /fancy/foo 
GET /fancy/baz 

그러나 일부 fancy 핸들러가 구현되지 않을 수 있습니다; 이 경우 base 하나를 사용해야합니다. 예에서

:

application = web.Application([ 
    (r"/base/foo", handlers.BaseFooHandler, {"some": "settings"}), 
    (r"/base/baz", handlers.BaseBazHandler, {"some": "settings"}), 
    (r"/fancy/foo", handlers.FancyFooHandler, {"some": "settings"}), 
]) 

cilent이 일을해야 GET /fancy/bazBaseBazHandler를 요청합니다.

토네이도 라우팅을 사용하여 어떻게 달성 할 수 있습니까?

답변

0

데코레이터를 사용하여 경로를 등록 했으므로 일치하지 않는/등록되지 않은 모든 경로에 응답하는 맞춤 라우터를 만들 수 있습니다. /fancy/.* 올바르게 작동하려면 끝에 라우터 을 등록해야합니다.

이렇게하면 /fancy/... 경로가 등록되지 않은 경우에만 맞춤 라우터가 일치합니다. 따라서 맞춤 라우터 클래스는 다음 작업을 수행해야합니다.

  1. 대체 번호 BaseBazHandler이 존재하는지 확인하십시오.
  2. 존재하는 경우 요청을 전달하십시오.
  3. 그렇지 않으면 404 오류를 반환합니다.

더 이상 진행하기 전에 404 개 요청을 처리 할 수있는 사용자 정의 클래스를 만들어야합니다. 이것은 핸들러가 발견되지 않으면 404 오류를 리턴하는 가장 쉬운 방법이기 때문에 필요합니다.

: 당신은 사용자 정의 라우터를 등록 할 수 있습니다, 당신은 다른 모든 경로를 추가 한 후, 마지막으로

from tornado.routing import Router 

class MyRouter(Router): 
    def __init__(self, app): 
     self.app = app 

    def find_handler(self, request, **kwargs): 
     endpoint = request.path.split('/')[2] # last part of the path 

     fallback_handler = 'Base%sHandler' % endpoint.title() 
     # fallback_handler will look like this - 'BaseBazHandler' 

     # now check if the handler exists in the current file 
     try: 
      handler = globals()[fallback_handler] 
     except KeyError: 
      handler = Handle404 

     return self.app.get_handler_delegate(request, handler) 

:

class Handle404(RequestHandler): 
    def get(self): 
     self.set_status(404) 
     self.write('404 Not Found') 

좋아, 이제 사용자 정의 라우터를 작성할 수

from tornado.routing import PathMatches 

application.add_handlers(r'.*', # listen for all hosts 
    [ 
     (PathMatches(r"/fancy/.*"), MyRouter(application)), 
    ] 
) 

나는 MyRouter.find_handler을 지적해야하며, 현재 모듈 (파일)에있는 핸들러에 대해서만 체크를 체크한다. 원하는 경우 다른 모듈에서 핸들러를 검색하도록 코드를 수정하십시오.

+0

사실, 클래스 디자이너와 함께 자동으로 핸들러를 추가합니다. 핸들러가없는 경우 추가 입력 점을 추가하는 해커를 작성하고 싶지 않습니다. –

+0

@SergeyBelash 안녕하세요, 답변을 업데이트했습니다. . 보세요. – xyres