我有一个带有Python和Flask的小型REST API,对于一些GET请求,我需要接受一个后视持续时间参数,例如: "一个月,B天,C小时,D分钟"。
此参数将从查询字符串中解析,但我有点不确定如何构建查询字符串以进行解析。除了后视之外,查询字符串中还有其他字段,这使得事情变得复杂。
我提出了两个主要选择。
接受查询字符串中的后视单个字段,例如: "8months5days"
,然后为传递的字符串扩展一些正则表达式解决方案,如virhilo's here:
regex = re.compile(r'((?P<hours>\d+?)hr)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?')
之后我可以从结果中构造datetime.timedelta
。
在我的查询字符串中为持续时间的不同组件接受多个字段,例如"behind_m=8&behind_d=5"
。然后使用urllib
获取完整查询字符串的字典
query_d = parse_qs(request.query_string)
最后将query_d
与
durations = {'behind_m': 'months', 'behind_d': 'days', 'behind_y': 'years', ...}
之后我可以直接构建datetime.timedelta
。
我的自然倾向是选择第二种选择,因为我对正则表达式很弱,我喜欢清晰度。但是,我最终可能会在某些查询字符串中要求多个持续时间,这在某些情况下会导致查询字符串非常长。
有没有一种很好的方法来实现这一点,那就是正则表达式?我知道如果有一种干净的方法来解析某些字符串格式的持续时间,整个任务会更简单,但是尽管看了datetime
和dateutil
我还没有找到任何支持持续时间解析。
答案 0 :(得分:0)
我选择的工具是URI中的逗号分隔列表:
SET @average=(SELECT AVG(weight()) avg_rank FROM common WHERE match('query text') OPTION ranker=expr('sum(word_count)*100 + sum(lcs*user_weight)*100 + bm25 + sum(exact_order)*200');
SELECT *, weight() as rank, 2000 * exp( - 9.594E-5 * abs(1486121357 - _rank_date)/1000) AS date_rank, IF(_importance > @average,_importance,0) AS importance_rank, (rank + date_rank + importance_rank) as total_rank FROM common WHERE match('query text') OPTION ranker=expr('sum(word_count)*100 + sum(lcs*user_weight)*100 + bm25 + sum(exact_order)*200')
解析为:
?behind=2,1,20,1,23,3
基于常见用例(如果您输入更长的持续时间或更短的持续时间),我决定采用格式durations = {'years': 2, 'months': 1, 'days': 20, hours: 1, minutes: 23, seconds: 3}
还是反过来。
要构建此year,months,days,hours,minutes,seconds
,您可以dict
字符串并将其放入字典中:
split