我正在将AIOHTTP用于web应用程序。我正在使用Cerberus来验证用户输入。我使用wrk基准测试工具运行了一些测试,发现以下Cerberus验证器:
"uri": {
"type": "string",
"coerce": str,
"required": True,
"minlength": 1,
"maxlength": 255,
"regex": "^[a-zA-Z0-9/_]+$"
}将大约10-15%的加载时间添加到网页。这对我来说是不能接受的。如何解决这个问题?是不是只有regex引擎?有没有更快的模块?我知道字符串解析函数通常比正则表达式更快。有没有不使用regex的验证引擎?一个将正则表达式转换为字符串解析的工具会很有趣。
编辑:我运行了一个分析器:
from cerberus import Validator
from speed_profiler import SpeedProfiler
from pprint import pprint
def referer_validator(value):
if len(value) < 1 or len(value) > 256:
return False
if not any(not l.isalnum() and l not in ['_', '/'] for l in value):
return False
return True
v = Validator()
v.schema = {
"path": {
"type": "string",
"coerce": str,
"required": True,
"minlength": 1,
"maxlength": 255,
"regex": "^[a-zA-Z0-9/_]+$"
}
}
sp = SpeedProfiler('Cerberus')
v.validate({'path': '/some/path_foo'})
sp.mark('Parser Function')
referer_validator('/some/path_foo')
profile = sp.stop()
pprint(profile)这证实了Cerberus速度很慢:
[{'duration': 0.00029901403468102217,
'identifier': 'Cerberus',
'line_num': 27,
'percent_time': 98.26},
{'duration': 5.29497629031539e-06,
'identifier': 'Parser Function',
'line_num': 31,
'percent_time': 1.74}]这证实了Cerberus速度很慢。现在,我使用这个来获得更快的速度:
def path_valid(value):
if len(value) < 1 or len(value) > 256:
return False
if not any(not l.isalnum() and l not in ['_', '/'] for l in value):
return False
return True发布于 2020-03-10 06:31:12
如果您更喜欢使用非正则表达式解决方案,可以使用
def path_valid(value):
if len(value) < 1 or len(value) > 255:
return False
if not any(not l.isalnum() and l not in ['_', '/'] for l in value):
return False
return True如果值的长度小于1或大于255 (由于if len(value) < 1 or len(value) > 255检查),此方法将使验证失败;如果存在非字母数字且不是_或/的字符(使用if not any(not l.isalnum() and l not in ['_', '/'] for l in value)进行检查),则此方法将失败。
请参阅Python test here。
https://stackoverflow.com/questions/60606486
复制相似问题