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 では機能するようですが、一部の有効な 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自分で 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
...

モンキーパッチを適用するか、または orリクエストURLValidatorを使用するように拡張する以外に、これを解決する方法がわかりません。そうする前に、まったく使用するかどうかを慎重に検討する必要があります(使用しないとこの問題はなくなります)。本人曰く、GETPOSTcheck_existscore/validators.py

「このURLField verify_exists引数には、扱いにくいセキュリティとパフォーマンスの問題があります。したがって、廃止されました。」

開発中のバージョンの Django では、この機能が実際に完全に破棄されていることがわかります。

于 2012-08-13T18:56:10.937 に答える