2017-02-23 4 views
0

Ich schreibe einen HTTP Request Handler mit intuitiven Routing. Mein Ziel ist es, einen Decorator auf eine Funktion anwenden zu können, die sowohl die verwendete HTTP-Methode als auch den Pfad angibt, auf dem die dekorierte Funktion ausgeführt werden soll. Hier ist ein Beispiel für diese Implementierung:Wie extrahiere ich Teilstrings aus einer maskierten Python-Zeichenkette?

Allerdings möchte ich auch Variablen in den Pfad hinzufügen können. Zum Beispiel würde /personnel/3 ein Personal mit einer ID von 3 holen. Die Art, wie ich dies tun möchte, ist eine Art 'variable Maske' für den Pfad, der an den route_handler übergeben wird. Ein neues Beispiel wäre:

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

Der Zweck des Dekorateur den Pfad wörtlichen (/personnel/3 zum Beispiel) mit dem Pfad ‚Maske‘ (/personnel/{ID}) und übergeben Sie die 3 in die dekorierten Funktion zu vergleichen sei. Ich nehme an, die Lösung wäre, die beiden Strings zu vergleichen, die Unterschiede beizubehalten und den Unterschied im Literal in eine Variable zu setzen, die nach dem Unterschied in der Maske benannt ist (ohne geschweifte Klammern). Aber dann würde ich auch überprüfen, ob die wörtliche die Maske passt minus die {} variablen Fänger ...


tl; dr - ist es eine Möglichkeit,

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

zu tun

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

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

+0

Das ist fast genau das, was eine [Flask] (http://flask.pooco.org/) -App aussieht, warum benutzt du das nicht? – jonrsharpe

+0

Das ['behave' BDD-Modul] (http://pythonhosted.org/behave/) verwendet diesen Ansatz, um Funktionsargumente zu erkennen und zu definieren. Vielleicht möchten Sie sich den Quellcode ansehen. –

+1

@jonrsharpe Das sind Hausaufgaben, die ich weit von den Anforderungen der Aufgabe entfernt habe. Das Minimum ist, dass ich Pythons natives http.server-Modul und keine Bibliotheken verwenden muss. Ich möchte lernen, wie man die Dekoration macht und die variable Extraktion selbst durchführt. –

Antwort

0

Da ich vermute, es nicht wirklich eine einfache solut ist Dazu werde ich die Lösung posten, die ich gemacht habe. Ich hatte gehofft, es würde etwas sein, ich in ein paar Zeilen tun könnten, aber oh well _ (ツ) _/¯

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 

Eine Maske ist nur eine Zeichenfolge wie eine von den unten:

/resource 
/resource/{ID} 
/group/{name}/resource/{ID} 
Verwandte Themen