[英]How to extract substrings from a masked Python string?
我正在編寫具有直觀路由的HTTP請求處理程序。 我的目標是能夠將裝飾器應用於一個函數,該函數聲明正在使用的HTTP方法以及執行裝飾函數的偵聽路徑。 這是此實現的示例:
@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/3
)與路徑“ mask”( /personnel/{ID}
)進行比較,並將3傳遞給裝飾函數。 我假設解決方案是比較兩個字符串,保留差異,並將文字中的差異放入以掩碼中的差異命名的變量中(減去花括號)。 但是然后,我還必須檢查文字是否匹配掩碼,減去{}
變量捕獲器...
tl; dr-有沒有辦法
stringMask("/personnel/{ID}", "/personnel/5") -> True, {"ID": 5}
stringMask("/personnel/{ID}", "/flowers/5") -> False, {}
stringMask("/personnel/{ID}", "/personnel") -> False, {}
因為我猜想真的沒有一個簡單的解決方案,所以我將發布我所做的解決方案。 我本來希望可以在幾行中做點什么,但是哦¯_(ツ)_ /¯
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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.