django URLValidator выдал фиктивные ошибки

Я использую Django URLValidator следующим образом в форме:

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/. Есть ли причина фиктивных ошибок?


person KVISH    schedule 13.08.2012    source источник


Ответы (1)


Посмотрите на исходник URLValidator; если вы укажете check_exists, он сделает HEAD запрос к URL-адресу, чтобы проверить, действителен ли он:

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

Попробуйте сами сделать запрос HEAD к Amazon, и вы увидите проблему:

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 для использования запроса GET или POST; прежде чем сделать это, следует хорошенько подумать, стоит ли вообще использовать check_exists (без чего эта проблема должна исчезнуть). Как говорит сам core/validators.py,

«Аргумент URLField verify_exists имеет неразрешимые проблемы с безопасностью и производительностью. Соответственно, он устарел».

Вы обнаружите, что версия Django, находящаяся в разработке, действительно полностью избавилась от этой функции.

person supervacuo    schedule 13.08.2012