|
import re
|
|
|
|
|
|
class ValidationFailure(BaseException):
|
|
"""
|
|
class for Validation exceptions
|
|
"""
|
|
|
|
|
|
domain_pattern = re.compile(
|
|
r'^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|'
|
|
r'([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|'
|
|
r'([a-zA-Z0-9][-_.a-zA-Z0-9]{0,61}[a-zA-Z0-9]))\.'
|
|
r'([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}.[a-zA-Z]{2,3})$'
|
|
)
|
|
|
|
|
|
def domain(value, raise_errors=True):
|
|
"""
|
|
Return whether or not given value is a valid domain.
|
|
|
|
If the value is valid domain name this function returns ``True``, otherwise
|
|
:class:`~validators.ValidationFailure` or False if raise_errors muted.
|
|
|
|
Examples::
|
|
>>> domain('example.com')
|
|
True
|
|
|
|
>>> domain('example.com/')
|
|
ValidationFailure(func=domain, ...)
|
|
|
|
Supports IDN domains as well::
|
|
|
|
>>> domain('xn----gtbspbbmkef.xn--p1ai')
|
|
True
|
|
:param value: domain string to validate
|
|
:param raise_errors: raise errors or return False
|
|
"""
|
|
if domain_pattern.match(value) is None:
|
|
if raise_errors:
|
|
raise ValidationFailure("{} is not valid domain".format(value))
|
|
else:
|
|
return False
|
|
return True
|
|
|