2011-12-06 9 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

まずから取られ

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

解釈しやすいが、あまり堅牢だ例です、安らかなスタイル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など)を探している正規表現の2つのチャンクを使用し、ハンドラで私はBaseHandlerでは地雷を置くが、貼り付け(再利用可能な機能parseRestArgsを定義しますそれは、IDのやり取りのフォーマットを分割する、理解の容易さ/スペースの節約のためのものです。あなたは特定の順序で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を見Railsの実施の線に沿って何かのために撮影された私はRESTfuのように自己記述URLを好むだろうlアプリケーション。 urlの部分は、リソースの形式を表現する必要はありません。 http://www.enterprise.com/customer/abc/order/123は、xml/html/jsonであるかどうかにかかわらずリソースを表す必要があります。要求された形式を送信する方法は、要求パラメータの1つとして送信することです。

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 

適切な形式にシリアル化するには、requestパラメータを使用します。

+0

同じでポストを編集できますが、私は本当にユーザー向けのために行っていました[rails](http://api.rubyonrails.org/classes/Mime/Type.html)に見られるようなRESTfulなapiの実装 – odgrim

1

mimetypeはこれを行う正しい方法ですが、最終的なユーザーが希望する形式でより簡単な方法でデータにアクセスする方法を知ることができます。

標準に準拠したライブラリなどとの互換性を維持するためには、要求されたMIMEタイプに基づいて応答タイプを最終的に決定し、ヘッダーに適切なMIMEタイプで応答する必要があります。

これを達成するための方法は、ルートが応答できる定義されたサフィックスのタプルに一致する接尾辞に対して要求されたURIをチェックするパーサを追加することです。まだ指定されていない場合は、渡されたMIMEタイプを接尾辞の正しいタイプに変更します。

最後の決定は、接尾辞ではなく、指定されたmimetypeに基づいていることを確認してください。

他の人が自分の使用する方法であなたのRESTfulなサービスと対話することができますし、あなたはまだ人間のための使いやすさを維持することができますこの方法では、など

〜編集〜

相続人かどうかをチェック例の正規表現それが.jsで終わるならば| .html | .xml | .json。これは与えられた完全なURIを前提としています。ここで

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

これらの正規表現のがrfc2396