validators 模块

class gluon.validators.ANY_OF(subs, error_message=None)[源代码]

基类:pydal.validators.Validator

测试列表中的任何验证程序是否成功返回::

>>> ANY_OF([IS_EMAIL(),IS_ALPHANUMERIC()])('a@b.co')
('a@b.co', None)
>>> ANY_OF([IS_EMAIL(),IS_ALPHANUMERIC()])('abco')
('abco', None)
>>> ANY_OF([IS_EMAIL(),IS_ALPHANUMERIC()])('@ab.co')
('@ab.co', 'enter only letters, numbers, and underscore')
>>> ANY_OF([IS_ALPHANUMERIC(),IS_EMAIL()])('@ab.co')
('@ab.co', 'enter a valid email address')
formatter(value)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

validate(value, record_id=None)[源代码]
class gluon.validators.CLEANUP(regex=None)[源代码]

基类:pydal.validators.Validator

实例

用作:

INPUT(_type='text', _name='name', requires=CLEANUP())

在验证时删除特殊字符

REGEX_CLEANUP = '[^\t\n\r -~]'
validate(value, record_id=None)[源代码]
class gluon.validators.CRYPT(key=None, digest_alg='pbkdf2(1000,20,sha512)', min_length=0, error_message='Too short', salt=True, max_length=1024)[源代码]

基类:pydal.validators.Validator

实例

用作:

INPUT(_type='text', _name='name', requires=CRYPT())

使用摘要对验证时的值进行编码。

如果没有提供参数,则crypt使用MD5算法。如果提供了key参数,则使用hmac+md5算法。如果指定了Digest_-Alg,则使用它来替换MD5,例如,sha512。摘要算法可以是作为字符串或算法本身的hashlib算法的名称。

Min_length是最小密码长度(默认为4)-对于严重的安全错误,为“强”。如果密码太短,则为“消息”。

请注意,接受空密码但无效。它不允许重新登录。将垃圾存储为哈希密码。

指定一个算法,或者默认情况下我们将使用sha512。

典型可用算法:

md5、sha1、sha224、sha256、sha384、sha512

如果是salt,它会用salt散列密码。如果salt为真,则此方法将自动生成一个。无论哪种情况,它都返回以下格式的加密密码字符串:

<algorithm>

重要提示:哈希密码作为lazycrypt对象返回,仅在需要时计算。lasycrypt对象还知道如何将自己与现有的salt密码进行比较。

支持标准算法

>>> for alg in ('md5','sha1','sha256','sha384','sha512'):
...     print(str(CRYPT(digest_alg=alg,salt=True)('test')[0]))
md5$...$...
sha1$...$...
sha256$...$...
sha384$...$...
sha512$...$...

语法总是alg$salt$hash

支持PBKdf2

>>> alg = 'pbkdf2(1000,20,sha512)'
>>> print(str(CRYPT(digest_alg=alg,salt=True)('test')[0]))
pbkdf2(1000,20,sha512)$...$...

可以指定可选的hmac_密钥,并将其用作salt前缀

>>> a = str(CRYPT(digest_alg='md5',key='mykey',salt=True)('test')[0])
>>> print(a)
md5$...$...

即使算法更改,哈希值仍然可以被验证。

>>> CRYPT(digest_alg='sha1',key='mykey',salt=True)('test')[0] == a
True

如果没有指定salt,crypt可以根据长度猜测算法:

>>> a = str(CRYPT(digest_alg='sha1',salt=False)('test')[0])
>>> a
'sha1$$a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'
>>> CRYPT(digest_alg='sha1',salt=False)('test')[0] == a
True
>>> CRYPT(digest_alg='sha1',salt=False)('test')[0] == a[6:]
True
>>> CRYPT(digest_alg='md5',salt=False)('test')[0] == a
True
>>> CRYPT(digest_alg='md5',salt=False)('test')[0] == a[6:]
True
STARS = '******'
formatter(value)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

validate(value, record_id=None)[源代码]
class gluon.validators.IS_ALPHANUMERIC(error_message='Enter only letters, numbers, and underscore')[源代码]

基类:pydal.validators.IS_MATCH

例子

用作:

INPUT(_type='text', _name='name', requires=IS_ALPHANUMERIC())

>>> IS_ALPHANUMERIC()('1')
('1', None)
>>> IS_ALPHANUMERIC()('')
('', None)
>>> IS_ALPHANUMERIC()('A_a')
('A_a', None)
>>> IS_ALPHANUMERIC()('!')
('!', 'enter only letters, numbers, and underscore')
class gluon.validators.IS_DATE(format='%Y-%m-%d', error_message='Enter date as %(format)s')[源代码]

基类:pydal.validators.Validator

实例

用作:

INPUT(_type='text', _name='name', requires=IS_DATE())

日期必须采用ISO8960格式YYYY-MM-DD

formatter(value)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

validate(value, record_id=None)[源代码]
class gluon.validators.IS_DATETIME(format='%Y-%m-%d %H:%M:%S', error_message='Enter date and time as %(format)s', timezone=None)[源代码]

基类:pydal.validators.Validator

实例

用作:

INPUT(_type='text', _name='name', requires=IS_DATETIME())

日期时间必须是ISO8960格式的yyyy-mm-dd hh:mm:ss timezome必须是none或pytz.timezone(“America/Chicago”)对象

formatter(value)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

isodatetime = '%Y-%m-%d %H:%M:%S'
static nice(format)[源代码]
validate(value, record_id=None)[源代码]
class gluon.validators.IS_DATETIME_IN_RANGE(minimum=None, maximum=None, format='%Y-%m-%d %H:%M:%S', error_message=None, timezone=None)[源代码]

基类:pydal.validators.IS_DATETIME

实例

用作:
>>> v = IS_DATETIME_IN_RANGE(                    minimum=datetime.datetime(2008,1,1,12,20),                     maximum=datetime.datetime(2009,12,31,12,20),                     format="%m/%d/%Y %H:%M",error_message="Oops")
>>> v('03/03/2008 12:40')
(datetime.datetime(2008, 3, 3, 12, 40), None)
>>> v('03/03/2010 10:34')
('03/03/2010 10:34', 'oops')
>>> v(datetime.datetime(2008,3,3,0,0))
(datetime.datetime(2008, 3, 3, 0, 0), None)
>>> v(datetime.datetime(2010,3,3,0,0))
(datetime.datetime(2010, 3, 3, 0, 0), 'oops')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_DATE_IN_RANGE(minimum=None, maximum=None, format='%Y-%m-%d', error_message=None)[源代码]

基类:pydal.validators.IS_DATE

实例

用作:

>>> v = IS_DATE_IN_RANGE(minimum=datetime.date(2008,1,1),                                      maximum=datetime.date(2009,12,31),                                      format="%m/%d/%Y",error_message="Oops")

>>> v('03/03/2008')
(datetime.date(2008, 3, 3), None)

>>> v('03/03/2010')
('03/03/2010', 'oops')

>>> v(datetime.date(2008,3,3))
(datetime.date(2008, 3, 3), None)

>>> v(datetime.date(2010,3,3))
(datetime.date(2010, 3, 3), 'oops')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_DECIMAL_IN_RANGE(minimum=None, maximum=None, error_message=None, dot='.')[源代码]

基类:pydal.validators.Validator

确定参数是(或可以表示为)python decimal,并且它在指定的包含范围内。并与python十进制算法进行了比较。

最小和最大限值可以为无,分别表示没有下限或上限。

例子

用作:

INPUT(_type='text', _name='name', requires=IS_DECIMAL_IN_RANGE(0, 10))

>>> IS_DECIMAL_IN_RANGE(1,5)('4')
(Decimal('4'), None)
>>> IS_DECIMAL_IN_RANGE(1,5)(4)
(Decimal('4'), None)
>>> IS_DECIMAL_IN_RANGE(1,5)(1)
(Decimal('1'), None)
>>> IS_DECIMAL_IN_RANGE(1,5)(5.25)
(5.25, 'enter a number between 1 and 5')
>>> IS_DECIMAL_IN_RANGE(5.25,6)(5.25)
(Decimal('5.25'), None)
>>> IS_DECIMAL_IN_RANGE(5.25,6)('5.25')
(Decimal('5.25'), None)
>>> IS_DECIMAL_IN_RANGE(1,5)(6.0)
(6.0, 'enter a number between 1 and 5')
>>> IS_DECIMAL_IN_RANGE(1,5)(3.5)
(Decimal('3.5'), None)
>>> IS_DECIMAL_IN_RANGE(1.5,5.5)(3.5)
(Decimal('3.5'), None)
>>> IS_DECIMAL_IN_RANGE(1.5,5.5)(6.5)
(6.5, 'enter a number between 1.5 and 5.5')
>>> IS_DECIMAL_IN_RANGE(1.5,None)(6.5)
(Decimal('6.5'), None)
>>> IS_DECIMAL_IN_RANGE(1.5,None)(0.5)
(0.5, 'enter a number greater than or equal to 1.5')
>>> IS_DECIMAL_IN_RANGE(None,5.5)(4.5)
(Decimal('4.5'), None)
>>> IS_DECIMAL_IN_RANGE(None,5.5)(6.5)
(6.5, 'enter a number less than or equal to 5.5')
>>> IS_DECIMAL_IN_RANGE()(6.5)
(Decimal('6.5'), None)
>>> IS_DECIMAL_IN_RANGE(0,99)(123.123)
(123.123, 'enter a number between 0 and 99')
>>> IS_DECIMAL_IN_RANGE(0,99)('123.123')
('123.123', 'enter a number between 0 and 99')
>>> IS_DECIMAL_IN_RANGE(0,99)('12.34')
(Decimal('12.34'), None)
>>> IS_DECIMAL_IN_RANGE()('abc')
('abc', 'enter a number')
formatter(value)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

validate(value, record_id=None)[源代码]
class gluon.validators.IS_EMAIL(banned=None, forced=None, error_message='Enter a valid email address')[源代码]

基类:pydal.validators.Validator

检查字段值是否为有效的电子邮件地址。可以设置为不允许或强制来自某些域的地址。

电子邮件regex改编自http://haacked.com/archive/2007/08/21/i-knows-how-to-validate-an-email-address-until-i.aspx,通常遵循RFC,但我们不允许在子域标签中使用带引号的字符串和允许下划线和前导数字。

参数
  • banned -- 不允许的地址域的regex文本

  • forced -- 所需地址域的regex文本

两个参数也可以是具有match(value)方法的自定义对象。

例子

检查有效的电子邮件地址:

INPUT(_type='text', _name='name',
    requires=IS_EMAIL())

检查不能来自.com域的有效电子邮件地址::

INPUT(_type='text', _name='name',
    requires=IS_EMAIL(banned='^.*\.com(|\..*)$'))

检查必须来自.edu域的有效电子邮件地址::

INPUT(_type='text', _name='name',
    requires=IS_EMAIL(forced='^.*\.edu(|\..*)$'))

>>> IS_EMAIL()('a@b.com')
('a@b.com', None)
>>> IS_EMAIL()('abc@def.com')
('abc@def.com', None)
>>> IS_EMAIL()('abc@3def.com')
('abc@3def.com', None)
>>> IS_EMAIL()('abc@def.us')
('abc@def.us', None)
>>> IS_EMAIL()('abc@d_-f.us')
('abc@d_-f.us', None)
>>> IS_EMAIL()('@def.com')           # missing name
('@def.com', 'enter a valid email address')
>>> IS_EMAIL()('"abc@def".com')      # quoted name
('"abc@def".com', 'enter a valid email address')
>>> IS_EMAIL()('abc+def.com')        # no @
('abc+def.com', 'enter a valid email address')
>>> IS_EMAIL()('abc@def.x')          # one-char TLD
('abc@def.x', 'enter a valid email address')
>>> IS_EMAIL()('abc@def.12')         # numeric TLD
('abc@def.12', 'enter a valid email address')
>>> IS_EMAIL()('abc@def..com')       # double-dot in domain
('abc@def..com', 'enter a valid email address')
>>> IS_EMAIL()('abc@.def.com')       # dot starts domain
('abc@.def.com', 'enter a valid email address')
>>> IS_EMAIL()('abc@def.c_m')        # underscore in TLD
('abc@def.c_m', 'enter a valid email address')
>>> IS_EMAIL()('NotAnEmail')         # missing @
('NotAnEmail', 'enter a valid email address')
>>> IS_EMAIL()('abc@NotAnEmail')     # missing TLD
('abc@NotAnEmail', 'enter a valid email address')
>>> IS_EMAIL()('customer/department@example.com')
('customer/department@example.com', None)
>>> IS_EMAIL()('$A12345@example.com')
('$A12345@example.com', None)
>>> IS_EMAIL()('!def!xyz%abc@example.com')
('!def!xyz%abc@example.com', None)
>>> IS_EMAIL()('_Yosemite.Sam@example.com')
('_Yosemite.Sam@example.com', None)
>>> IS_EMAIL()('~@example.com')
('~@example.com', None)
>>> IS_EMAIL()('.wooly@example.com')       # dot starts name
('.wooly@example.com', 'enter a valid email address')
>>> IS_EMAIL()('wo..oly@example.com')      # adjacent dots in name
('wo..oly@example.com', 'enter a valid email address')
>>> IS_EMAIL()('pootietang.@example.com')  # dot ends name
('pootietang.@example.com', 'enter a valid email address')
>>> IS_EMAIL()('.@example.com')            # name is bare dot
('.@example.com', 'enter a valid email address')
>>> IS_EMAIL()('Ima.Fool@example.com')
('Ima.Fool@example.com', None)
>>> IS_EMAIL()('Ima Fool@example.com')     # space in name
('Ima Fool@example.com', 'enter a valid email address')
>>> IS_EMAIL()('localguy@localhost')       # localhost as domain
('localguy@localhost', None)
REGEX_BODY = "\n        ^(?!\\.)                           # name may not begin with a dot\n        (\n          [-a-z0-9!\\#$%&'*+/=?^_`{|}~]    # all legal characters except dot\n          |\n          (?<!\\.)\\.                       # single dots only\n        )+\n        (?<!\\.)$                          # name may not end with a dot\n    "
REGEX_DOMAIN = '\n        (\n          localhost\n          |\n          (\n            [a-z0-9]      # [sub]domain begins with alphanumeric\n            (\n              [-\\w]*      # alphanumeric, underscore, dot, hyphen\n              [a-z0-9]    # ending alphanumeric\n            )?\n          \\.              # ending dot\n          )+\n          [a-z]{2,}       # TLD alpha-only\n       )$\n    '
validate(value, record_id=None)[源代码]
class gluon.validators.IS_EMPTY_OR(other, null=None, empty_regex=None)[源代码]

基类:pydal.validators.Validator

用于测试的虚拟类为“空”或:

>>> IS_EMPTY_OR(IS_EMAIL())('abc@def.com')
('abc@def.com', None)
>>> IS_EMPTY_OR(IS_EMAIL())('   ')
(None, None)
>>> IS_EMPTY_OR(IS_EMAIL(), null='abc')('   ')
('abc', None)
>>> IS_EMPTY_OR(IS_EMAIL(), null='abc', empty_regex='def')('def')
('abc', None)
>>> IS_EMPTY_OR(IS_EMAIL())('abc')
('abc', 'enter a valid email address')
>>> IS_EMPTY_OR(IS_EMAIL())(' abc ')
('abc', 'enter a valid email address')
formatter(value)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

set_self_id(id)[源代码]
validate(value, record_id=None)[源代码]
class gluon.validators.IS_EQUAL_TO(expression, error_message='No match')[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='password')
INPUT(_type='text', _name='password2',
      requires=IS_EQUAL_TO(request.vars.password))

的参数“等于”是一个字符串:

>>> IS_EQUAL_TO('aaa')('aaa')
('aaa', None)

>>> IS_EQUAL_TO('aaa')('aab')
('aab', 'no match')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_EXPR(expression, error_message='Invalid expression', environment=None)[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='name',
    requires=IS_EXPR('5 < int(value) < 10'))

is expr的参数必须是python条件::

>>> IS_EXPR('int(value) < 2')('1')
('1', None)

>>> IS_EXPR('int(value) < 2')('2')
('2', 'invalid expression')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_FILE(filename=None, extension=None, lastdot=True, case=1, error_message='Enter valid filename')[源代码]

基类:pydal.validators.Validator

检查通过文件输入上载的文件的名称和扩展名是否符合给定条件。

not 以任何方式确保文件类型。如果未上载数据,则返回验证失败。

参数
  • filename -- 字符串/编译的regex或字符串列表/有效文件名的regex

  • extension -- 字符串/编译的regex或字符串列表/有效扩展名的regex

  • lastdot -- 哪个点应用作文件名/扩展名分隔符:true表示最后一个点,例如file.jpg.png->file.jpg/png false表示第一个点,例如file.tar.gz->file/tar.gz

  • case -- 0-保留大小写,1-将字符串转换为小写(默认),2-将字符串转换为大写

如果不存在点,则将对空字符串进行扩展检查,并对整个值进行文件名检查。

实例

检查文件是否具有PDF扩展名(不区分大小写):

输入(_type='file'、_name='name',

requires=is_file(extension='pdf'))

检查文件是否称为“缩略图”,扩展名是否为JPG或PNG(不区分大小写):

输入(_type='file'、_name='name',

requires=is_file(filename='thumbnail',扩展名= [“JPG”,“PNG”] )

检查文件是否具有tar.gz扩展名和以backup开头的名称:

输入(_type='file'、_name='name',

requires=is_file(filename=re.compile('backup.*),extension='tar.gz',lastdot=false))。

检查文件是否没有扩展名和名称匹配的自述文件(区分大小写):

输入(_type='file'、_name='name',

requires=is_文件(文件名为'readme',扩展名为',大小写为0)

match(value1, value2)[源代码]
validate(value, record_id=None)[源代码]
class gluon.validators.IS_FLOAT_IN_RANGE(minimum=None, maximum=None, error_message=None, dot='.')[源代码]

基类:pydal.validators.Validator

确定参数是(或可以表示为)浮点值,并且它在指定的包含范围内。并与本机算法进行了比较。

最小和最大限值可以为无,分别表示没有下限或上限。

例子

用作:

INPUT(_type='text', _name='name', requires=IS_FLOAT_IN_RANGE(0, 10))

>>> IS_FLOAT_IN_RANGE(1,5)('4')
(4.0, None)
>>> IS_FLOAT_IN_RANGE(1,5)(4)
(4.0, None)
>>> IS_FLOAT_IN_RANGE(1,5)(1)
(1.0, None)
>>> IS_FLOAT_IN_RANGE(1,5)(5.25)
(5.25, 'enter a number between 1 and 5')
>>> IS_FLOAT_IN_RANGE(1,5)(6.0)
(6.0, 'enter a number between 1 and 5')
>>> IS_FLOAT_IN_RANGE(1,5)(3.5)
(3.5, None)
>>> IS_FLOAT_IN_RANGE(1,None)(3.5)
(3.5, None)
>>> IS_FLOAT_IN_RANGE(None,5)(3.5)
(3.5, None)
>>> IS_FLOAT_IN_RANGE(1,None)(0.5)
(0.5, 'enter a number greater than or equal to 1')
>>> IS_FLOAT_IN_RANGE(None,5)(6.5)
(6.5, 'enter a number less than or equal to 5')
>>> IS_FLOAT_IN_RANGE()(6.5)
(6.5, None)
>>> IS_FLOAT_IN_RANGE()('abc')
('abc', 'enter a number')
formatter(value)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

validate(value, record_id=None)[源代码]
class gluon.validators.IS_IMAGE(extensions=('bmp', 'gif', 'jpeg', 'png'), maxsize=(10000, 10000), minsize=(0, 0), aspectratio=(- 1, - 1), error_message='Invalid image')[源代码]

基类:pydal.validators.Validator

检查通过文件输入上载的文件是否以所选图像格式之一保存,并且在给定边界内具有尺寸(宽度和高度)。

not 检查最大文件大小(使用长度)。如果未上载数据,则返回验证失败。

支持的文件格式:BMP、GIF、JPEG、PNG。

代码部分取自http://mail.python.org/pipermail/python-list/2007-june/617126.html

参数
  • extensions -- 允许包含ITerable 小写字母 图像文件扩展名

  • 'jpeg') (('jpg' extension of uploaded file counts as) --

  • maxsize -- 包含图像最大宽度和高度的iterable

  • minsize -- 包含图像最小宽度和高度的iterable

  • aspectratio -- 包含目标纵横比的ITerable

使用(-1,-1)作为minSize以通过图像大小检查。使用(-1,-1)作为电气,以通过纵横比检查。

实例

检查上载的文件是否为任何支持的图像格式:

输入(_type='file',_name='name',requires=is_image())

检查上载的文件是否为jpeg或png:

输入(_type='file'、_name='name',

requires=is_image(扩展名=('jpeg'、'png'))

检查上载的文件是否为最大大小为200x200像素的PNG:

输入(_type='file'、_name='name',

requires=is_image(extensions=“'png”),maxsize=(200,200))。

检查上载文件的纵横比是否为16:9:

输入(_type='file'、_name='name',

requires=is_image(aspectratio=(16,9)))

validate(value, record_id=None)[源代码]
class gluon.validators.IS_INT_IN_RANGE(minimum=None, maximum=None, error_message=None)[源代码]

基类:pydal.validators.Validator

确定参数是(或可以表示为)int,并且它在指定的范围内。这个范围是以 Python 的方式解释的,所以测试是:最小<=值<最大。

最小和最大限值可以为无,分别表示没有下限或上限。

例子

用作:

INPUT(_type='text', _name='name', requires=IS_INT_IN_RANGE(0, 10))

>>> IS_INT_IN_RANGE(1,5)('4')
(4, None)
>>> IS_INT_IN_RANGE(1,5)(4)
(4, None)
>>> IS_INT_IN_RANGE(1,5)(1)
(1, None)
>>> IS_INT_IN_RANGE(1,5)(5)
(5, 'enter an integer between 1 and 4')
>>> IS_INT_IN_RANGE(1,5)(5)
(5, 'enter an integer between 1 and 4')
>>> IS_INT_IN_RANGE(1,5)(3.5)
(3.5, 'enter an integer between 1 and 4')
>>> IS_INT_IN_RANGE(None,5)('4')
(4, None)
>>> IS_INT_IN_RANGE(None,5)('6')
('6', 'enter an integer less than or equal to 4')
>>> IS_INT_IN_RANGE(1,None)('4')
(4, None)
>>> IS_INT_IN_RANGE(1,None)('0')
('0', 'enter an integer greater than or equal to 1')
>>> IS_INT_IN_RANGE()(6)
(6, None)
>>> IS_INT_IN_RANGE()('abc')
('abc', 'enter an integer')
REGEX_INT = '^[+-]?\\d+$'
validate(value, record_id=None)[源代码]
class gluon.validators.IS_IN_DB(dbset, field, label=None, error_message='Value not in database', orderby=None, groupby=None, distinct=None, cache=None, multiple=False, zero='', sort=False, _and=None, left=None, delimiter=None, auto_add=False)[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='name',
      requires=IS_IN_DB(db, db.mytable.myfield, zero=''))

用于引用字段,呈现为Dropbox

REGEX_INTERP_CONV_SPECIFIER = '%\\((\\w+)\\)\\d*(?:\\.\\d+)?[a-zA-Z]'
REGEX_TABLE_DOT_FIELD = '^(\\w+)\\.(\\w+)$'
build_set()[源代码]
maybe_add(table, fieldname, value)[源代码]
options(zero=True)[源代码]
set_self_id(id)[源代码]
validate(value, record_id=None)[源代码]
class gluon.validators.IS_IN_SET(theset, labels=None, error_message='Value not allowed', multiple=False, zero='', sort=False)[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='name',
      requires=IS_IN_SET(['max', 'john'],zero=''))

is_in_set的参数必须是列表或集合::

>>> IS_IN_SET(['max', 'john'])('max')
('max', None)
>>> IS_IN_SET(['max', 'john'])('massimo')
('massimo', 'value not allowed')
>>> IS_IN_SET(['max', 'john'], multiple=True)(('max', 'john'))
(('max', 'john'), None)
>>> IS_IN_SET(['max', 'john'], multiple=True)(('bill', 'john'))
(('bill', 'john'), 'value not allowed')
>>> IS_IN_SET(('id1','id2'), ['first label','second label'])('id1') # Traditional way
('id1', None)
>>> IS_IN_SET({'id1':'first label', 'id2':'second label'})('id1')
('id1', None)
>>> import itertools
>>> IS_IN_SET(itertools.chain(['1','3','5'],['2','4','6']))('1')
('1', None)
>>> IS_IN_SET([('id1','first label'), ('id2','second label')])('id1') # Redundant way
('id1', None)
options(zero=True)[源代码]
validate(value, record_id=None)[源代码]
class gluon.validators.IS_IPADDRESS(minip='0.0.0.0', maxip='255.255.255.255', invert=False, is_localhost=None, is_private=None, is_automatic=None, is_ipv4=None, is_link_local=None, is_reserved=None, is_multicast=None, is_routeable=None, is_6to4=None, is_teredo=None, subnets=None, is_ipv6=None, error_message='Enter valid IP address')[源代码]

基类:pydal.validators.Validator

检查字段值是否为IP地址(v4或v6)。可以设置为强制指定范围内的地址。使用正确的is_ipv4和is_ipv6验证器进行检查。

使用python 3标准库中的ipaddress及其python 2后端端口(在contrib/ipaddress.py中)。

参数
  • minip -- 允许的最低地址;接受:str,例如192.168.0.1八进制列表或元组,例如。 [192, 168, 0,1]

  • maxip -- 允许的最高地址;同上

  • invert -- 如果为true,则只允许来自给定范围之外的地址;请注意,范围边界不以这种方式匹配

IPv4特定参数:

  • 是“localhost:localhost地址处理:

    • 无(默认):无所谓

    • 真(强制):查询地址必须与本地主机地址匹配(127.0.0.1)

    • 假(禁止):查询地址不能与本地主机地址匹配

  • 私有:与上述相同,只是查询地址是根据两个地址范围检查的:172.16.0.0-172.31.255.255和192.168.0.0-192.168.255.255

  • 是否自动:与上述相同,只是查询地址是根据一个地址范围进行检查的:169.254.0.0-169.254.255.255

  • 是u ipv4:或者:

    • 无(默认):无所谓

    • 真(强制):必须是IPv4地址

    • 错误(禁止):不能是IPv4地址

IPv6特定参数:

  • _link_local:与上面相同,但使用fe80::/10范围

  • 保留:与上面相同,但使用IETF保留范围

  • 多播:与上面相同,但使用ff00::/8范围

  • 可路由:与上面类似,但不强制私有、本地链接、保留或多播

  • to4:与上面相同,但使用2002::/16范围

  • 与上面相同,但使用2001::/32范围

  • 子网:值必须是子网列表中至少一个的成员

  • 是u ipv6:或者:

    • 无(默认):无所谓

    • 真(强制):必须是IPv6地址

    • 错误(禁止):不能是IPv6地址

minip和maxip也可以是以上所有形式的地址列表或元组(str、int、list/tuple),允许设置多个地址范围:

minip = (minip1, minip2, ... minipN)
           |       |           |
           |       |           |
maxip = (maxip1, maxip2, ... maxipN)

较长的iterable将被截断以匹配较短的iterable的长度。

>>> IS_IPADDRESS()('192.168.1.5')
('192.168.1.5', None)
>>> IS_IPADDRESS(is_ipv6=False)('192.168.1.5')
('192.168.1.5', None)
>>> IS_IPADDRESS()('255.255.255.255')
('255.255.255.255', None)
>>> IS_IPADDRESS()('192.168.1.5 ')
('192.168.1.5 ', 'enter valid IP address')
>>> IS_IPADDRESS()('192.168.1.1.5')
('192.168.1.1.5', 'enter valid IP address')
>>> IS_IPADDRESS()('123.123')
('123.123', 'enter valid IP address')
>>> IS_IPADDRESS()('1111.2.3.4')
('1111.2.3.4', 'enter valid IP address')
>>> IS_IPADDRESS()('0111.2.3.4')
('0111.2.3.4', 'enter valid IP address')
>>> IS_IPADDRESS()('256.2.3.4')
('256.2.3.4', 'enter valid IP address')
>>> IS_IPADDRESS()('300.2.3.4')
('300.2.3.4', 'enter valid IP address')
>>> IS_IPADDRESS(minip='192.168.1.0', maxip='192.168.1.255')('192.168.1.100')
('192.168.1.100', None)
>>> IS_IPADDRESS(minip='1.2.3.5', maxip='1.2.3.9', error_message='Bad ip')('1.2.3.4')
('1.2.3.4', 'bad ip')
>>> IS_IPADDRESS(maxip='1.2.3.4', invert=True)('127.0.0.1')
('127.0.0.1', None)
>>> IS_IPADDRESS(maxip='192.168.1.4', invert=True)('192.168.1.4')
('192.168.1.4', 'enter valid IP address')
>>> IS_IPADDRESS(is_localhost=True)('127.0.0.1')
('127.0.0.1', None)
>>> IS_IPADDRESS(is_localhost=True)('192.168.1.10')
('192.168.1.10', 'enter valid IP address')
>>> IS_IPADDRESS(is_localhost=False)('127.0.0.1')
('127.0.0.1', 'enter valid IP address')
>>> IS_IPADDRESS(maxip='100.0.0.0', is_localhost=True)('127.0.0.1')
('127.0.0.1', 'enter valid IP address')
>>> IS_IPADDRESS()('fe80::126c:8ffa:fe22:b3af')
('fe80::126c:8ffa:fe22:b3af', None)
>>> IS_IPADDRESS(is_ipv4=False)('fe80::126c:8ffa:fe22:b3af')
('fe80::126c:8ffa:fe22:b3af', None)
>>> IS_IPADDRESS()('fe80::126c:8ffa:fe22:b3af  ')
('fe80::126c:8ffa:fe22:b3af  ', 'enter valid IP address')
>>> IS_IPADDRESS(is_ipv4=True)('fe80::126c:8ffa:fe22:b3af')
('fe80::126c:8ffa:fe22:b3af', 'enter valid IP address')
>>> IS_IPADDRESS(is_ipv6=True)('192.168.1.1')
('192.168.1.1', 'enter valid IP address')
>>> IS_IPADDRESS(is_ipv6=True, error_message='Bad ip')('192.168.1.1')
('192.168.1.1', 'bad ip')
>>> IS_IPADDRESS(is_link_local=True)('fe80::126c:8ffa:fe22:b3af')
('fe80::126c:8ffa:fe22:b3af', None)
>>> IS_IPADDRESS(is_link_local=False)('fe80::126c:8ffa:fe22:b3af')
('fe80::126c:8ffa:fe22:b3af', 'enter valid IP address')
>>> IS_IPADDRESS(is_link_local=True)('2001::126c:8ffa:fe22:b3af')
('2001::126c:8ffa:fe22:b3af', 'enter valid IP address')
>>> IS_IPADDRESS(is_multicast=True)('2001::126c:8ffa:fe22:b3af')
('2001::126c:8ffa:fe22:b3af', 'enter valid IP address')
>>> IS_IPADDRESS(is_multicast=True)('ff00::126c:8ffa:fe22:b3af')
('ff00::126c:8ffa:fe22:b3af', None)
>>> IS_IPADDRESS(is_routeable=True)('2001::126c:8ffa:fe22:b3af')
('2001::126c:8ffa:fe22:b3af', None)
>>> IS_IPADDRESS(is_routeable=True)('ff00::126c:8ffa:fe22:b3af')
('ff00::126c:8ffa:fe22:b3af', 'enter valid IP address')
>>> IS_IPADDRESS(subnets='2001::/32')('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', None)
>>> IS_IPADDRESS(subnets='fb00::/8')('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', 'enter valid IP address')
>>> IS_IPADDRESS(subnets=['fc00::/8','2001::/32'])('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', None)
>>> IS_IPADDRESS(subnets='invalidsubnet')('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', 'invalid subnet provided')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_IPV4(minip='0.0.0.0', maxip='255.255.255.255', invert=False, is_localhost=None, is_private=None, is_automatic=None, error_message='Enter valid IPv4 address')[源代码]

基类:pydal.validators.Validator

检查字段值是否为十进制形式的IP版本4地址。可以设置为强制某个范围内的地址。

IPv4 regex取自:http://regexlib.com/redetails.aspx?ReLogExpID=1411

参数
  • minip -- 允许的最低地址;接受:-str,例如192.168.0.1-八位字节的列表或元组,例如。 [192, 168, 0,1]

  • maxip -- 允许的最高地址;同上

  • invert -- 如果为true,则只允许来自给定范围之外的地址;请注意,范围边界不以这种方式匹配

  • is_localhost -- 本地主机地址处理:-无(默认):无差异-真(强制):查询地址必须与本地主机地址匹配(127.0.0.1)-假(禁止):查询地址不能与本地主机地址匹配

  • is_private -- 同上,但查询地址是根据两个地址范围进行检查的:172.16.0.0-172.31.255.255和192.168.0.0-192.168.255.255

  • is_automatic -- 与上面相同,只是查询地址是根据一个地址范围进行检查的:169.254.0.0-169.254.255.255

minip和maxip也可以是以上所有形式的地址列表或元组(str、int、list/tuple),允许设置多个地址范围:

minip = (minip1, minip2, ... minipN)
           |       |           |
           |       |           |
maxip = (maxip1, maxip2, ... maxipN)

较长的iterable将被截断以匹配较短的iterable的长度。

实例

检查有效的IPv4地址:

输入(_type='text',_name='name',requires=is_ipv4())

检查属于特定范围的有效IPv4地址:

输入(_type='text'、_name='name',

要求=是“ipv4(minip='100.200.0.0',maxip='100.200.255.255'))

检查属于100.110.0.0-100.110.255.255或200.50.0.0-200.50.0.255地址范围的有效IPv4地址:

输入(_type='text'、_name='name',
要求=是“ipv4”(minip=“'100.110.0.0”,“200.50.0.0”),

最大值=('100.110.255.255','200.50.0.255'))

检查属于专用地址空间的有效IPv4地址:

输入(_type='text',_name='name',requires=is_ipv4(is_private=true))

检查不是本地主机地址的有效IPv4地址:

输入(_type='text',_name='name',requires=is_ipv4(is_localhost=false))

>>> IS_IPV4()('1.2.3.4')
('1.2.3.4', None)
>>> IS_IPV4()('255.255.255.255')
('255.255.255.255', None)
>>> IS_IPV4()('1.2.3.4 ')
('1.2.3.4 ', 'enter valid IPv4 address')
>>> IS_IPV4()('1.2.3.4.5')
('1.2.3.4.5', 'enter valid IPv4 address')
>>> IS_IPV4()('123.123')
('123.123', 'enter valid IPv4 address')
>>> IS_IPV4()('1111.2.3.4')
('1111.2.3.4', 'enter valid IPv4 address')
>>> IS_IPV4()('0111.2.3.4')
('0111.2.3.4', 'enter valid IPv4 address')
>>> IS_IPV4()('256.2.3.4')
('256.2.3.4', 'enter valid IPv4 address')
>>> IS_IPV4()('300.2.3.4')
('300.2.3.4', 'enter valid IPv4 address')
>>> IS_IPV4(minip='1.2.3.4', maxip='1.2.3.4')('1.2.3.4')
('1.2.3.4', None)
>>> IS_IPV4(minip='1.2.3.5', maxip='1.2.3.9', error_message='Bad ip')('1.2.3.4')
('1.2.3.4', 'bad ip')
>>> IS_IPV4(maxip='1.2.3.4', invert=True)('127.0.0.1')
('127.0.0.1', None)
>>> IS_IPV4(maxip='1.2.3.4', invert=True)('1.2.3.4')
('1.2.3.4', 'enter valid IPv4 address')
>>> IS_IPV4(is_localhost=True)('127.0.0.1')
('127.0.0.1', None)
>>> IS_IPV4(is_localhost=True)('1.2.3.4')
('1.2.3.4', 'enter valid IPv4 address')
>>> IS_IPV4(is_localhost=False)('127.0.0.1')
('127.0.0.1', 'enter valid IPv4 address')
>>> IS_IPV4(maxip='100.0.0.0', is_localhost=True)('127.0.0.1')
('127.0.0.1', 'enter valid IPv4 address')
REGEX_IPV4 = re.compile('^(([1-9]?\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d\\d|2[0-4]\\d|25[0-5])$')
automatic = (2851995648, 2852061183)
localhost = 2130706433
numbers = (16777216, 65536, 256, 1)
private = ((2886729728, 2886795263), (3232235520, 3232301055))
validate(value, record_id=None)[源代码]
class gluon.validators.IS_IPV6(is_private=None, is_link_local=None, is_reserved=None, is_multicast=None, is_routeable=None, is_6to4=None, is_teredo=None, subnets=None, error_message='Enter valid IPv6 address')[源代码]

基类:pydal.validators.Validator

检查字段值是否为IP版本6地址。

使用python 3标准库中的ipaddress及其python 2后端端口(在contrib/ipaddress.py中)。

参数
  • is_private -- 无(默认):无差异真(强制):地址必须在fc00::/7范围假(禁止):地址不能在fc00::/7范围内

  • is_link_local -- 同上,但使用fe80::/10范围

  • is_reserved -- 同上,但使用IETF保留范围

  • is_multicast -- 同上,但使用ff00::/8范围

  • is_routeable -- 与上面类似,但不强制私有、链接本地、保留或多播

  • is_6to4 -- 同上,但使用2002::/16范围

  • is_teredo -- 同上,但使用2001::/32范围

  • subnets -- 值必须是子网列表中至少一个的成员

实例

检查有效的IPv6地址:

输入(_type='text',_name='name',requires=is_ipv6())

检查有效的IPv6地址是否为链接本地地址:

输入(_type='text',_name='name',requires=is_ipv6(is_link_local=true))

检查Internet可路由的有效IPv6地址:

输入(_type='text',_name='name',requires=is_ipv6(is_routeable=true))

检查指定子网中的有效IPv6地址:

输入(_type='text'、_name='name',要求=is_ipv6(子网= ['2001::/32'] )

>>> IS_IPV6()('fe80::126c:8ffa:fe22:b3af')
('fe80::126c:8ffa:fe22:b3af', None)
>>> IS_IPV6()('192.168.1.1')
('192.168.1.1', 'enter valid IPv6 address')
>>> IS_IPV6(error_message='Bad ip')('192.168.1.1')
('192.168.1.1', 'bad ip')
>>> IS_IPV6(is_link_local=True)('fe80::126c:8ffa:fe22:b3af')
('fe80::126c:8ffa:fe22:b3af', None)
>>> IS_IPV6(is_link_local=False)('fe80::126c:8ffa:fe22:b3af')
('fe80::126c:8ffa:fe22:b3af', 'enter valid IPv6 address')
>>> IS_IPV6(is_link_local=True)('2001::126c:8ffa:fe22:b3af')
('2001::126c:8ffa:fe22:b3af', 'enter valid IPv6 address')
>>> IS_IPV6(is_multicast=True)('2001::126c:8ffa:fe22:b3af')
('2001::126c:8ffa:fe22:b3af', 'enter valid IPv6 address')
>>> IS_IPV6(is_multicast=True)('ff00::126c:8ffa:fe22:b3af')
('ff00::126c:8ffa:fe22:b3af', None)
>>> IS_IPV6(is_routeable=True)('2001::126c:8ffa:fe22:b3af')
('2001::126c:8ffa:fe22:b3af', None)
>>> IS_IPV6(is_routeable=True)('ff00::126c:8ffa:fe22:b3af')
('ff00::126c:8ffa:fe22:b3af', 'enter valid IPv6 address')
>>> IS_IPV6(subnets='2001::/32')('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', None)
>>> IS_IPV6(subnets='fb00::/8')('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', 'enter valid IPv6 address')
>>> IS_IPV6(subnets=['fc00::/8','2001::/32'])('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', None)
>>> IS_IPV6(subnets='invalidsubnet')('2001::8ffa:fe22:b3af')
('2001::8ffa:fe22:b3af', 'invalid subnet provided')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_JSON(error_message='Invalid json', native_json=False)[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='name',
    requires=IS_JSON(error_message="This is not a valid json input")

>>> IS_JSON()('{"a": 100}')
({u'a': 100}, None)

>>> IS_JSON()('spam1234')
('spam1234', 'invalid json')
formatter(value)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

validate(value, record_id=None)[源代码]
class gluon.validators.IS_LENGTH(maxsize=255, minsize=0, error_message='Enter from %(min)g to %(max)g characters')[源代码]

基类:pydal.validators.Validator

检查字段值的长度是否在给定边界之间。适用于文本和文件输入。

参数
  • maxsize -- 最大允许长度/尺寸

  • minsize -- 最小允许长度/尺寸

实例

检查文本字符串是否少于33个字符::

INPUT(_type='text', _name='name', requires=IS_LENGTH(32))

检查密码字符串是否超过5个字符::

INPUT(_type='password', _name='name', requires=IS_LENGTH(minsize=6))

检查上传文件的大小是否在1KB到1MB之间:

INPUT(_type='file', _name='name', requires=IS_LENGTH(1048576, 1024))

其他示例:

>>> IS_LENGTH()('')
('', None)
>>> IS_LENGTH()('1234567890')
('1234567890', None)
>>> IS_LENGTH(maxsize=5, minsize=0)('1234567890')  # too long
('1234567890', 'enter from 0 to 5 characters')
>>> IS_LENGTH(maxsize=50, minsize=20)('1234567890')  # too short
('1234567890', 'enter from 20 to 50 characters')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_LIST_OF(other=None, minimum=None, maximum=None, error_message=None)[源代码]

基类:pydal.validators.Validator

validate(value, record_id=None)[源代码]
class gluon.validators.IS_LIST_OF_EMAILS(error_message='Invalid emails: %s')[源代码]

基类:pydal.validators.Validator

例子

用作:

field('emails','list:string',

widget=sqlform.widgets.text.widget,requires=is_list_of_emails(),represent=lambda v,r:xml(','.join( [A(x, _href='mailto:'+x).xml() for x in (v or [] ))

REGEX_NOT_EMAIL_SPLITTER = '[^,;\\s]+'
formatter(value, row=None)[源代码]

对于某些验证器,返回值的格式化版本(与验证器匹配)。否则只返回值。

validate(value, record_id=None)[源代码]
class gluon.validators.IS_LOWER[源代码]

基类:pydal.validators.Validator

转换为小写:

>>> IS_LOWER()('ABC')
('abc', None)
>>> IS_LOWER()('Ñ')
('\xc3\xb1', None)
validate(value, record_id=None)[源代码]
class gluon.validators.IS_MATCH(expression, error_message='Invalid expression', strict=False, search=False, extract=False, is_unicode=False)[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='name', requires=IS_MATCH('.+'))

的参数是u match是正则表达式::

>>> IS_MATCH('.+')('hello')
('hello', None)

>>> IS_MATCH('hell')('hello')
('hello', None)

>>> IS_MATCH('hell.*', strict=False)('hello')
('hello', None)

>>> IS_MATCH('hello')('shello')
('shello', 'invalid expression')

>>> IS_MATCH('hello', search=True)('shello')
('shello', None)

>>> IS_MATCH('hello', search=True, strict=False)('shellox')
('shellox', None)

>>> IS_MATCH('.*hello.*', search=True, strict=False)('shellox')
('shellox', None)

>>> IS_MATCH('.+')('')
('', 'invalid expression')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_NOT_EMPTY(error_message='Enter a value', empty_regex=None)[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='name', requires=IS_NOT_EMPTY())

>>> IS_NOT_EMPTY()(1)
(1, None)
>>> IS_NOT_EMPTY()(0)
(0, None)
>>> IS_NOT_EMPTY()('x')
('x', None)
>>> IS_NOT_EMPTY()(' x ')
('x', None)
>>> IS_NOT_EMPTY()(None)
(None, 'enter a value')
>>> IS_NOT_EMPTY()('')
('', 'enter a value')
>>> IS_NOT_EMPTY()('  ')
('', 'enter a value')
>>> IS_NOT_EMPTY()(' \n\t')
('', 'enter a value')
>>> IS_NOT_EMPTY()([])
([], 'enter a value')
>>> IS_NOT_EMPTY(empty_regex='def')('def')
('', 'enter a value')
>>> IS_NOT_EMPTY(empty_regex='de[fg]')('deg')
('', 'enter a value')
>>> IS_NOT_EMPTY(empty_regex='def')('abc')
('abc', None)
validate(value, record_id=None)[源代码]
class gluon.validators.IS_NOT_IN_DB(dbset, field, error_message='Value already in database or empty', allowed_override=[], ignore_common_filters=False)[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='name', requires=IS_NOT_IN_DB(db, db.table))

使字段独一无二

set_self_id(id)[源代码]
validate(value, record_id=None)[源代码]
gluon.validators.IS_NULL_OR

:py:class:`pydal.validators.IS_EMPTY_OR`的别名

class gluon.validators.IS_SLUG(maxlen=80, check=False, error_message='Must be slug', keep_underscores=False)[源代码]

基类:pydal.validators.Validator

将任意文本字符串转换为段塞::

>>> IS_SLUG()('abc123')
('abc123', None)
>>> IS_SLUG()('ABC123')
('abc123', None)
>>> IS_SLUG()('abc-123')
('abc-123', None)
>>> IS_SLUG()('abc--123')
('abc-123', None)
>>> IS_SLUG()('abc 123')
('abc-123', None)
>>> IS_SLUG()('abc      _123')
('abc-123', None)
>>> IS_SLUG()('-abc-')
('abc', None)
>>> IS_SLUG()('--a--b--_ -c--')
('a-b-c', None)
>>> IS_SLUG()('abc&amp;123')
('abc123', None)
>>> IS_SLUG()('abc&amp;123&amp;def')
('abc123def', None)
>>> IS_SLUG()('ñ')
('n', None)
>>> IS_SLUG(maxlen=4)('abc123')
('abc1', None)
>>> IS_SLUG()('abc_123')
('abc-123', None)
>>> IS_SLUG(keep_underscores=False)('abc_123')
('abc-123', None)
>>> IS_SLUG(keep_underscores=True)('abc_123')
('abc_123', None)
>>> IS_SLUG(check=False)('abc')
('abc', None)
>>> IS_SLUG(check=True)('abc')
('abc', None)
>>> IS_SLUG(check=False)('a bc')
('a-bc', None)
>>> IS_SLUG(check=True)('a bc')
('a bc', 'must be slug')
static urlify(value, maxlen=80, keep_underscores=False)[源代码]
validate(value, record_id=None)[源代码]
class gluon.validators.IS_STRONG(min=None, max=None, upper=None, lower=None, number=None, entropy=None, special=None, specials='~!@#$%^&*()_+-=?<>,.:;{}[]|', invalid=' "', error_message=None, es=False)[源代码]

基类:pydal.validators.Validator

实例

用作:

INPUT(_type='password', _name='passwd',
requires=IS_STRONG(min=10, special=2, upper=2))

在字段上强制执行复杂性要求

>>> IS_STRONG(es=True)('Abcd1234')
('Abcd1234',
 'Must include at least 1 of the following: ~!@#$%^&*()_+-=?<>,.:;{}[]|')
>>> IS_STRONG(es=True)('Abcd1234!')
('Abcd1234!', None)
>>> IS_STRONG(es=True, entropy=1)('a')
('a', None)
>>> IS_STRONG(es=True, entropy=1, min=2)('a')
('a', 'Minimum length is 2')
>>> IS_STRONG(es=True, entropy=100)('abc123')
('abc123', 'Password too simple (32.35/100)')
>>> IS_STRONG(es=True, entropy=100)('and')
('and', 'Password too simple (14.57/100)')
>>> IS_STRONG(es=True, entropy=100)('aaa')
('aaa', 'Password too simple (14.42/100)')
>>> IS_STRONG(es=True, entropy=100)('a1d')
('a1d', 'Password too simple (15.97/100)')
>>> IS_STRONG(es=True, entropy=100)('añd')
('a\xc3\xb1d', 'Password too simple (31.26/10)')
validate(value, record_id=None)[源代码]
class gluon.validators.IS_TIME(error_message='Enter time as hh:mm:ss (seconds, am, pm optional)')[源代码]

基类:pydal.validators.Validator

例子

用作:

INPUT(_type='text', _name='name', requires=IS_TIME())

了解以下格式hh:mm:ss [am/pm] HH:毫米 [am/pm] HH [am/pm]

[am/pm] 是可选的,可以用任何其他非空格非数字替换“:”:

>>> IS_TIME()('21:30')
(datetime.time(21, 30), None)
>>> IS_TIME()('21-30')
(datetime.time(21, 30), None)
>>> IS_TIME()('21.30')
(datetime.time(21, 30), None)
>>> IS_TIME()('21:30:59')
(datetime.time(21, 30, 59), None)
>>> IS_TIME()('5:30')
(datetime.time(5, 30), None)
>>> IS_TIME()('5:30 am')
(datetime.time(5, 30), None)
>>> IS_TIME()('5:30 pm')
(datetime.time(17, 30), None)
>>> IS_TIME()('5:30 whatever')
('5:30 whatever', 'enter time as hh:mm:ss (seconds, am, pm optional)')
>>> IS_TIME()('5:30 20')
('5:30 20', 'enter time as hh:mm:ss (seconds, am, pm optional)')
>>> IS_TIME()('24:30')
('24:30', 'enter time as hh:mm:ss (seconds, am, pm optional)')
>>> IS_TIME()('21:60')
('21:60', 'enter time as hh:mm:ss (seconds, am, pm optional)')
>>> IS_TIME()('21:30::')
('21:30::', 'enter time as hh:mm:ss (seconds, am, pm optional)')
>>> IS_TIME()('')
('', 'enter time as hh:mm:ss (seconds, am, pm optional)')ù
REGEX_TIME = '((?P<h>[0-9]+))([^0-9 ]+(?P<m>[0-9 ]+))?([^0-9ap ]+(?P<s>[0-9]*))?((?P<d>[ap]m))?'
validate(value, record_id=None)[源代码]
class gluon.validators.IS_UPLOAD_FILENAME(filename=None, extension=None, lastdot=True, case=1, error_message='Enter valid filename')[源代码]

基类:pydal.validators.Validator

对于新应用程序,请使用is_file()。

检查通过文件输入上载的文件的名称和扩展名是否符合给定条件。

not 以任何方式确保文件类型。如果未上载数据,则返回验证失败。

参数
  • filename -- 文件名(点前)regex

  • extension -- 扩展(点后)regex

  • lastdot -- 哪个点应用作文件名/扩展名分隔符:true表示最后一个点,例如file.png->file/png false表示第一个点,例如file.tar.gz->file/tar.gz

  • case -- 0-保留大小写,1-将字符串转换为小写(默认),2-将字符串转换为大写

如果不存在点,则将对空字符串进行扩展检查,并对整个值进行文件名检查。

实例

检查文件是否具有PDF扩展名(不区分大小写):

输入(_type='file'、_name='name',

requires=is撊upload撊filename(extension='pdf'))

检查文件是否具有tar.gz扩展名和以backup开头的名称:

输入(_type='file'、_name='name',

requires=is_upload_filename(filename='backup.',extension='tar.gz',lastdot=false))。

检查文件是否没有扩展名和名称匹配的自述文件(区分大小写):

输入(_type='file'、_name='name',

requires=是上载文件名(文件名=^readme$,扩展名=^$,大小写=0)

validate(value, record_id=None)[源代码]
class gluon.validators.IS_UPPER[源代码]

基类:pydal.validators.Validator

转换为大写::

>>> IS_UPPER()('abc')
('ABC', None)
>>> IS_UPPER()('ñ')
('\xc3\x91', None)
validate(value, record_id=None)[源代码]
class gluon.validators.IS_URL(error_message='Enter a valid URL', mode='http', allowed_schemes=None, prepend_scheme='http', allowed_tlds=None)[源代码]

基类:pydal.validators.Validator

如果以下任何一项为真,则拒绝URL字符串:

  • 字符串为空或无

  • 字符串使用了URL中不允许的字符

  • 该字符串破坏了任何HTTP语法规则

  • 指定的URL方案(如果指定了)不是“http”或“https”

  • 顶级域(如果指定了主机名)不存在

(这些规则基于RFC2616:http://www.faqs.org/rfcs/rfc2616.html

此函数只检查URL的语法。例如,它不会检查URL是否指向一个真实的文档,或者是否在语义上有意义。如果是缩写的URL(例如“google.ca”),此函数会自动在URL前面加上“http://”。

如果使用参数mode='generic',则此函数的行为将更改。如果以下任何一项为真,则它将拒绝URL字符串:

  • 字符串为空或无

  • 字符串使用了URL中不允许的字符

  • 指定的URL方案(如果指定了)无效

(这些规则基于RFC2396:http://www.faqs.org/rfcs/rfc2396.html

允许的方案列表可以使用allowed_schemes参数进行自定义。如果不从列表中排除任何URL,则会拒绝缩写的URL(缺少“http”等方案)。

默认的预置方案可通过“预置方案”参数进行自定义。如果将Prepend_方案设置为“无”,则将禁用Prepend。仍将接受需要提前解析的URL,但不会修改返回值。

URL是否与RFC 3490(http://tools.ietf.org/html/rfc3490)中指定的国际化域名(idn)标准兼容?因此,URL可以是常规字符串或Unicode字符串。如果URL的域组件(例如google.ca)包含非US ASCII字母,则域将转换为punycode(在RFC3492中定义,http://tools.ietf.org/html/rfc3492)。is-url有点超出了标准,并且允许非US ASCII字符出现在url的路径和查询组件中。这些非US ASCII字符将使用标准的“%20”类型语法进行转义。例如,十六进制代码为0x4E86的Unicode字符将变为“%4E%86”

参数
  • error_message -- 一个字符串,如果URL未验证,则返回给最终用户的错误消息。

  • allowed_schemes -- 包含字符串或不包含字符串的列表。每个元素都是允许输入的URL使用的方案

  • prepend_scheme -- 一个字符串,如果需要使URL有效,则此方案是预先准备好的

代码示例:

INPUT(_type='text', _name='name', requires=IS_URL())
>>> IS_URL()('abc.com')
('http://abc.com', None)

INPUT(_type='text', _name='name', requires=IS_URL(mode='generic'))
>>> IS_URL(mode='generic')('abc.com')
('abc.com', None)

INPUT(_type='text', _name='name',
    requires=IS_URL(allowed_schemes=['https'], prepend_scheme='https'))
>>> IS_URL(allowed_schemes=['https'], prepend_scheme='https')('https://abc.com')
('https://abc.com', None)

INPUT(_type='text', _name='name',
    requires=IS_URL(prepend_scheme='https'))
>>> IS_URL(prepend_scheme='https')('abc.com')
('https://abc.com', None)

INPUT(_type='text', _name='name',
    requires=IS_URL(mode='generic', allowed_schemes=['ftps', 'https'],
        prepend_scheme='https'))
>>> IS_URL(mode='generic', allowed_schemes=['ftps', 'https'], prepend_scheme='https')('https://abc.com')
('https://abc.com', None)
>>> IS_URL(mode='generic', allowed_schemes=['ftps', 'https', None], prepend_scheme='https')('abc.com')
('abc.com', None)

@作者:乔纳森·本恩

validate(value, record_id=None)[源代码]
参数

value -- Unicode或常规字符串,要验证的URL

返回

一个(字符串、字符串)元组,其中tuple [0] 是修改后的输入值和元组 [1] 不是无(成功!)或字符串错误消息。在出现错误的情况下,永远不会修改输入值。但是,如果成功,则可以将输入URL修改为(1)预先准备方案,和/或(2)将不兼容的Unicode URL转换为兼容的US-ASCII版本。