2011-12-06 4 views
0

토네이도에서 서로 다른 요청 유형을 구분하는 방법은 무엇입니까? 또한 요청을 분리하는 적절한 방법은 무엇입니까? 내가 /item/1.xml에 가면 결국, 나는 XML은, /item/1.html가 적절한 HTML보기 등토네이도에서 렌더링 요청 유형

뭔가처럼되고 싶어 :

def getXML(): 
    return self.render('somexmlresult.xml') 

def getHTML(): 
    return self.rendeR('htmlresult.html') 

또는

def get(): 
    if request == 'xml': 
     return self.render('somexmlresult.xml') 
    elif request == 'html': 
     return self.render('htmlresult.html') 

~ 편집 ~ 내가

답변

1

첫 번째에서 가져온 핸들러를 설정하는이 정규식은 편안한 스타일의 URI에 의지 덜 강력한의 예입니다.우리는

class TaskServer(tornado.web.Application): 
    def __init__(self, newHandlers = [], debug = None): 
     request_format = "(\.[a-zA-Z]+$)?" 
     baseHandlers = [ 
      (r"/jobs" + request_format, JobsHandler), 
      (r"/jobs/", JobsHandler), 
      (r"/jobs/new" + request_format, NewJobsHandler), 
      (r"/jobs/([0-9]+)/edit" + request_format, EditJobsHandler) 
     ] 
     for handler in newHandlers: 
      baseHandlers.append(handler) 


    tornado.web.Application.__init__(self, baseHandlers, debug = debug) 

이제 ID와 잠재적 인 요구 포맷 (즉, HTML, XML, JSON 등)를 찾는 정규식의 두 덩어리를 사용 처리기에서 나는 BaseHandler에 광산을 넣어하지만, 붙여 넣기 (재사용 가능한 기능 parseRestArgs를 정의 여기에 ID와 요청 형식을 분리하는 이해의 용이성/공간 절약). 당신이 이드를 특정한 순서로 기대해야하기 때문에, 나는 그들을리스트에 붙입니다.

... get 함수는 더 추상화 될 수 있지만 분할 밖으로 다른 요청 형식으로 논리의 기본 개념을 보여줍니다

class JobsHandler(BaseHandler): 
    def parseRestArgs(self, args): 
     idList = [] 
     extension = None 
     if len(args) and not args[0] is None: 
      for arg in range(len(args)): 
       match = re.match("[0-9]+", args[arg]) 
       if match: 
        slave_id = int(match.groups()[0]) 

      match = re.match("(\.[a-zA-Z]+$)", args[-1]) 
      if match: 
       extension = match.groups()[0][1:] 

     return idList, extension 

    def get(self, *args): 
     ### Read 
     job_id, extension = self.parseRestArgs(args) 

     if len(job_id): 
      if extension == None or "html": 
       #self.render(html) # Show with some ID voodoo 
       pass 
      elif extension == 'json': 
       #self.render(json) # Show with some ID voodoo 
       pass 
      else: 
       raise tornado.web.HTTPError(404) #We don't do that sort of thing here... 
     else: 
      if extension == None or "html": 
       pass 
       # self.render(html) # Index- No ID given, show an index 
      elif extension == "json": 
       pass 
       # self.render(json) # Index- No ID given, show an index 
      else: 
       raise tornado.web.HTTPError(404) #We don't do that sort of thing here... 
동일하지만 난 정말 사용자가 직면위한 거라고와
2

here를 볼 레일 '구현의 라인을 따라 뭔가를 촬영했다 나는 RESTfu처럼 자체 기술 URL을 선호 신청. url 부분은 자원의 형식을 나타내는 데 필요하지 않습니다. http://www.enterprise.com/customer/abc/order/123은 xml/html/json인지 여부에 관계없이 리소스를 나타내야합니다. 요청 된 형식을 보내는 방법은 요청 매개 변수 중 하나로 전송하는 것입니다.

http://www.enterprise.com/customer/abc/order/123?mimetype=application/xml 
http://www.enterprise.com/customer/abc/order/123?mimetype=application/json 
http://www.enterprise.com/customer/abc/order/123?mimetype=text/html 

적절한 형식으로 serialize하려면 request 매개 변수를 사용하십시오.

+0

편집 포스트 [레일] (http://api.rubyonrails.org/classes/Mime/Type.html)에서 볼 수있는 것과 같은 RESTful API 구현 – odgrim

1

mimetype이 올바른 방법이지만 최종 사용자가 원하는 형식으로 데이터에 액세스하는 더 단순한 방법을 원할 것입니다.

표준 호환 라이브러리 등과의 호환성을 유지하려면 요청 된 MIME 형식에 따라 응답 유형을 결정하고 헤더에서 적절한 MIME 형식으로 응답해야합니다.

아무 것도 깨지 않는 동안 이것을 달성하는 방법은 라우트가 응답 할 수있는 정의 된 접미사의 튜플과 일치하는 접미어에 대해 요청 된 URI를 검사하는 파서를 추가하는 것입니다. 아직 지정되지 않은 경우 전달 된 MIME 유형을 접미어에 대한 올바른 유형으로 변경합니다.

최종 결정은 접미사가 아닌 제공된 mimetype을 기반으로해야합니다.

다른 사람들이하는 방식에 RESTful 서비스와 상호 작용할 수있는이 방법은 사용하고 당신은 여전히 ​​인간 등에 사용의 용이성을 유지할 수

~ 편집 ~

을 Heres 확인하는 예 정규 표현식 확인합니다 .js로 끝나는 경우 | .html | .xml | .json. 이것은 주어진 전체 URI를 가정합니다.

(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\.(?:js|html|xml|json))(?:\?([^#]*))?(?:#(.*))? 

여기 쉽게 해석 할 수 있지만,

^https?://(?:[a-z\-]+\.)+[a-z]{2,6}(?:/[^/#?]+)+\.(?:js|html|xml|json)$ 

의이 rfc2396

관련 문제