mirror of
https://github.com/django/django.git
synced 2025-07-07 19:29:12 +00:00
[soc2009/model-validation] validate url logic moved to validators
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/model-validation@11454 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
69fef1daef
commit
84c9cf16d3
@ -7,6 +7,54 @@ from django.utils.encoding import smart_unicode
|
|||||||
# These values, if given to validate(), will trigger the self.required check.
|
# These values, if given to validate(), will trigger the self.required check.
|
||||||
EMPTY_VALUES = (None, '', [], (), {})
|
EMPTY_VALUES = (None, '', [], (), {})
|
||||||
|
|
||||||
|
try:
|
||||||
|
from django.conf import settings
|
||||||
|
URL_VALIDATOR_USER_AGENT = settings.URL_VALIDATOR_USER_AGENT
|
||||||
|
except ImportError:
|
||||||
|
# It's OK if Django settings aren't configured.
|
||||||
|
URL_VALIDATOR_USER_AGENT = 'Django (http://www.djangoproject.com/)'
|
||||||
|
|
||||||
|
url_re = re.compile(
|
||||||
|
r'^https?://' # http:// or https://
|
||||||
|
r'(?:(?:[A-Z0-9]+(?:-*[A-Z0-9]+)*\.)+[A-Z]{2,6}|' #domain...
|
||||||
|
r'localhost|' #localhost...
|
||||||
|
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
|
||||||
|
r'(?::\d+)?' # optional port
|
||||||
|
r'(?:/?|/\S+)$', re.IGNORECASE)
|
||||||
|
|
||||||
|
class RegexValidator(object):
|
||||||
|
def __call__(self, value):
|
||||||
|
"""
|
||||||
|
Validates that the input matches the regular expression.
|
||||||
|
"""
|
||||||
|
if not self.regex.search(smart_unicode(value)):
|
||||||
|
raise ValidationError(_(u'Enter a valid value.'), code='invalid')
|
||||||
|
|
||||||
|
class URLValidator(RegexValidator):
|
||||||
|
def __init__(self, regex=url_re, verify_exists=False, validator_user_agent=URL_VALIDATOR_USER_AGENT):
|
||||||
|
self.regex = regex
|
||||||
|
self.verify_exists = verify_exists
|
||||||
|
self.user_agent = validator_user_agent
|
||||||
|
|
||||||
|
def __call__(self, value):
|
||||||
|
super(URLValidator, self).__call__(value)
|
||||||
|
if self.verify_exists:
|
||||||
|
import urllib2
|
||||||
|
headers = {
|
||||||
|
"Accept": "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
|
||||||
|
"Accept-Language": "en-us,en;q=0.5",
|
||||||
|
"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
|
||||||
|
"Connection": "close",
|
||||||
|
"User-Agent": self.user_agent,
|
||||||
|
}
|
||||||
|
try:
|
||||||
|
req = urllib2.Request(value, None, headers)
|
||||||
|
u = urllib2.urlopen(req)
|
||||||
|
except ValueError:
|
||||||
|
raise ValidationError(_(u'Enter a valid URL.'), code='invalid')
|
||||||
|
except: # urllib2.URLError, httplib.InvalidURL, etc.
|
||||||
|
raise ValidationError(_(u'This URL appears to be a broken link.'), code='invalid_link')
|
||||||
|
|
||||||
def validate_integer(value):
|
def validate_integer(value):
|
||||||
try:
|
try:
|
||||||
int(value)
|
int(value)
|
||||||
|
@ -457,14 +457,6 @@ class EmailField(CharField):
|
|||||||
}
|
}
|
||||||
default_validators = [validators.validate_email]
|
default_validators = [validators.validate_email]
|
||||||
|
|
||||||
try:
|
|
||||||
from django.conf import settings
|
|
||||||
URL_VALIDATOR_USER_AGENT = settings.URL_VALIDATOR_USER_AGENT
|
|
||||||
except ImportError:
|
|
||||||
# It's OK if Django settings aren't configured.
|
|
||||||
URL_VALIDATOR_USER_AGENT = 'Django (http://www.djangoproject.com/)'
|
|
||||||
|
|
||||||
|
|
||||||
class FileField(Field):
|
class FileField(Field):
|
||||||
widget = FileInput
|
widget = FileInput
|
||||||
default_error_messages = {
|
default_error_messages = {
|
||||||
@ -556,26 +548,17 @@ class ImageField(FileField):
|
|||||||
f.seek(0)
|
f.seek(0)
|
||||||
return f
|
return f
|
||||||
|
|
||||||
url_re = re.compile(
|
class URLField(CharField):
|
||||||
r'^https?://' # http:// or https://
|
|
||||||
r'(?:(?:[A-Z0-9]+(?:-*[A-Z0-9]+)*\.)+[A-Z]{2,6}|' #domain...
|
|
||||||
r'localhost|' #localhost...
|
|
||||||
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
|
|
||||||
r'(?::\d+)?' # optional port
|
|
||||||
r'(?:/?|/\S+)$', re.IGNORECASE)
|
|
||||||
|
|
||||||
class URLField(RegexField):
|
|
||||||
default_error_messages = {
|
default_error_messages = {
|
||||||
'invalid': _(u'Enter a valid URL.'),
|
'invalid': _(u'Enter a valid URL.'),
|
||||||
'invalid_link': _(u'This URL appears to be a broken link.'),
|
'invalid_link': _(u'This URL appears to be a broken link.'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, max_length=None, min_length=None, verify_exists=False,
|
def __init__(self, max_length=None, min_length=None, verify_exists=False,
|
||||||
validator_user_agent=URL_VALIDATOR_USER_AGENT, *args, **kwargs):
|
validator_user_agent=validators.URL_VALIDATOR_USER_AGENT, *args, **kwargs):
|
||||||
super(URLField, self).__init__(url_re, max_length, min_length, *args,
|
super(URLField, self).__init__(max_length, min_length, *args,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
self.verify_exists = verify_exists
|
self.validators.append(validators.URLValidator(verify_exists=verify_exists, validator_user_agent=validator_user_agent))
|
||||||
self.user_agent = validator_user_agent
|
|
||||||
|
|
||||||
def to_python(self, value):
|
def to_python(self, value):
|
||||||
# If no URL scheme given, assume http://
|
# If no URL scheme given, assume http://
|
||||||
@ -586,27 +569,6 @@ class URLField(RegexField):
|
|||||||
value += '/'
|
value += '/'
|
||||||
return super(URLField, self).to_python(value)
|
return super(URLField, self).to_python(value)
|
||||||
|
|
||||||
def validate(self, value):
|
|
||||||
super(URLField, self).validate(value)
|
|
||||||
if value == u'':
|
|
||||||
return value
|
|
||||||
if self.verify_exists:
|
|
||||||
import urllib2
|
|
||||||
headers = {
|
|
||||||
"Accept": "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
|
|
||||||
"Accept-Language": "en-us,en;q=0.5",
|
|
||||||
"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
|
|
||||||
"Connection": "close",
|
|
||||||
"User-Agent": self.user_agent,
|
|
||||||
}
|
|
||||||
try:
|
|
||||||
req = urllib2.Request(value, None, headers)
|
|
||||||
u = urllib2.urlopen(req)
|
|
||||||
except ValueError:
|
|
||||||
raise ValidationError(self.error_messages['invalid'])
|
|
||||||
except: # urllib2.URLError, httplib.InvalidURL, etc.
|
|
||||||
raise ValidationError(self.error_messages['invalid_link'])
|
|
||||||
|
|
||||||
class BooleanField(Field):
|
class BooleanField(Field):
|
||||||
widget = CheckboxInput
|
widget = CheckboxInput
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user