2017-02-23 13 views
0

私は直感的なルーティングでHTTPリクエストハンドラを書いています。私の目標は、装飾された関数を実行するために聞かれるべきパスと同様に、使用されているHTTPメソッドを記述する関数にデコレータを適用できることです。この実装のサンプルは次のとおりです。マスクされたPython文字列から部分文字列を抽出する方法は?

@route_handler("GET", "/personnel") 
def retrievePersonnel(): 
    return personnelDB.retrieveAll() 

ただし、パスに変数を追加することもできます。たとえば、/personnel/3はIDが3の人員をフェッチします。これを行う方法は、route_handlerに渡されたパスに「可変マスク」の並べ替えを指定する方法です。新しい例は、次のようになります

@route_handler("GET", "/personnel/{ID}") 
def retrievePersonnelByID(ID): 
    return personnelDB.retrieveByID(ID) 

デコレータの目的は、パス「マスク」(/personnel/{ID})リテラルパス(例えば/personnel/3)を比較して、修飾関数に3を通過することであろう。私は解決策が2つの文字列を比較し、違いを保持し、リテラルの違いをマスクの差異(中括弧を引いたもの)の名前を付けた変数に入れることを前提としています。しかし、私はまた...リテラルはマスクマイナス{}変数キャッチャーと一致するかどうかを確認する必要があると思います


TL; DR -

stringMask("/personnel/{ID}", "/personnel/5") -> True, {"ID": 5}

を行う方法があります

stringMask("/personnel/{ID}", "/flowers/5") -> False, {}

stringMask("/personnel/{ID}", "/personnel") -> False, {}

+0

これは[Flask](http://flask.pocoo.org/)アプリの外観とほとんど同じですが、それを使用しないでください。 – jonrsharpe

+0

['behave' BDDモジュール](http://pythonhosted.org/behave/)は、このアプローチを使用して関数の引数を検出し定義します。あなたは、ソースコードを見てみたいかもしれません。 –

+1

@jonrsharpeこれは課題の要件からはるかに離れている宿題です。最低限、私はPythonのネイティブhttp.serverモジュールとライブラリを使用していなければなりません。私は装飾を行い、変数抽出を自分で行う方法を学びたいと思う。 –

答えて

0

私が推測しているので、本当に簡単solutではありませんこれにイオン、私は私がした解決策を掲載するつもりです。私はいくつかの行に何ができるものになるだろうが期待していたが、まあ_(ツ)_ /¯

def checkPath(self, mask): 
    mask_parts = mask[1:].split("/") 
    path_parts = self.path[1:].rstrip("/").split("/") 
    if len(mask_parts) != len(path_parts): 
     self.urlVars = {} 
     return False 

    vars = {} 
    for i in range(len(mask_parts)): 
     if mask_parts[i][0] == "{": 
      vars[mask_parts[i][1:-1]] = path_parts[i] 
     else: 
      if mask_parts[i] != path_parts[i]: 
       self.urlVars = {} 
       return False 

    self.url_vars = vars # save extracted variables 
    return True 

マスクは、以下のもののような単なる文字列です:

/resource 
/resource/{ID} 
/group/{name}/resource/{ID} 
関連する問題