Python:validators.url不接受1-9之间的端口号,但接受大于65535的端口?

时间:2018-12-24 07:55:28

标签: python python-3.x

事实:TCP / UDP端口号范围从1-65535开始。

但是,我刚刚发现validators.url不接受1-10之间的端口号?

>>> for i in range(1,11): validators.url('http://example.com:%s' %i)
...
ValidationFailure(func=url, args={'value': 'http://example.com:1', 'public': False})
ValidationFailure(func=url, args={'value': 'http://example.com:2', 'public': False})
ValidationFailure(func=url, args={'value': 'http://example.com:3', 'public': False})
ValidationFailure(func=url, args={'value': 'http://example.com:4', 'public': False})
ValidationFailure(func=url, args={'value': 'http://example.com:5', 'public': False})
ValidationFailure(func=url, args={'value': 'http://example.com:6', 'public': False})
ValidationFailure(func=url, args={'value': 'http://example.com:7', 'public': False})
ValidationFailure(func=url, args={'value': 'http://example.com:8', 'public': False})
ValidationFailure(func=url, args={'value': 'http://example.com:9', 'public': False})
True
>>>

它也接受大于65535的端口号。

>>> for i in range(65535,65538): validators.url('http://example.com:%s' %i)
...
True
True
True
>>>

这种异常行为是否有任何原因?

是否可以仅在1-65535与Python3 validators.url之间接受有效的端口号?

1 个答案:

答案 0 :(得分:3)

the docs中所述,validators.url不是魔术,而是依赖于正则表达式。在端口的特定情况下,the regex

    // port number (optional)
"(?::\\d{2,5})?"

表示2到5位之间的任何数字都可以使用。因此01可以工作,但一位整数不能。

如果您遇到无效的端口号,则可以始终在validators.url之上添加限制。