9

URLValidator在表单中以下列方式使用 Django:

def clean_url(self):
    validate = URLValidator(verify_exists=True)
    url = self.cleaned_data.get('url')

    try:
        logger.info(url)
        validate(url)
    except ValidationError, e:
        logger.info(e)
        raise forms.ValidationError("That website does not exist. Please try again.")

    return self.cleaned_data.get('url')

它似乎适用于某些 url,但对于某些有效的,它会失败。我可以通过http://www.amazon.com/检查它是否失败(这显然是不正确的)。它通过http://www.cisco.com/传递。虚假错误有什么原因吗?

4

1 回答 1

8

查看源代码URLValidator;如果您指定check_exists,它会HEAD向 URL 发出请求以检查它是否有效:

req = urllib2.Request(url, None, headers)
req.get_method = lambda: 'HEAD'
...
opener.open(req, timeout=10)

尝试HEAD自己向亚马逊提出请求,您会看到问题:

carl@chaffinch:~$ HEAD http://www.amazon.com
405 MethodNotAllowed
Date: Mon, 13 Aug 2012 18:50:56 GMT
Server: Server
Vary: Accept-Encoding,User-Agent
Allow: POST, GET
...

URLValidator除了猴子补丁或以其他方式扩展以使用GETPOST请求之外,我看不到解决此问题的方法;在这样做之前,您应该仔细考虑是否要使用check_exists(没有它,这个问题应该消失)。正如core/validators.py它自己所说,

“该URLField verify_exists论点存在棘手的安全和性能问题。因此,它已被弃用。”

你会发现 Django 的开发版本确实已经完全抛弃了这个特性。

于 2012-08-13T18:56:10.937 回答