首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cerberus/regex瓶颈-性能验证实践

Cerberus/regex瓶颈-性能验证实践
EN

Stack Overflow用户
提问于 2020-03-10 02:35:47
回答 1查看 159关注 0票数 0

我正在将AIOHTTP用于web应用程序。我正在使用Cerberus来验证用户输入。我使用wrk基准测试工具运行了一些测试,发现以下Cerberus验证器:

代码语言:javascript
复制
"uri": {
        "type": "string",
        "coerce": str,
        "required": True,
        "minlength": 1,
        "maxlength": 255,
        "regex": "^[a-zA-Z0-9/_]+$"
    }

将大约10-15%的加载时间添加到网页。这对我来说是不能接受的。如何解决这个问题?是不是只有regex引擎?有没有更快的模块?我知道字符串解析函数通常比正则表达式更快。有没有不使用regex的验证引擎?一个将正则表达式转换为字符串解析的工具会很有趣。

编辑:我运行了一个分析器:

代码语言:javascript
复制
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速度很慢:

代码语言:javascript
复制
[{'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速度很慢。现在,我使用这个来获得更快的速度:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2020-03-10 06:31:12

如果您更喜欢使用非正则表达式解决方案,可以使用

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60606486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档