KVI*_*ISH 9 python django url-validation
我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')
Run Code Online (Sandbox Code Playgroud)
它似乎适用于某些网址,但对于某些有效网址,它会失败.我能够通过http://www.amazon.com/检查它是否失败(这显然是不正确的).它通过http://www.cisco.com/.是否存在伪造错误的原因?
看看来源URLValidator ; 如果您指定check_exists,它会HEAD向URL 发出请求以检查它是否有效:
req = urllib2.Request(url, None, headers)
req.get_method = lambda: 'HEAD'
...
opener.open(req, timeout=10)
Run Code Online (Sandbox Code Playgroud)
尝试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
...
Run Code Online (Sandbox Code Playgroud)
除了猴子修补或以其他方式扩展URLValidator使用GET或POST请求之外,我看不到解决这个问题的方法; 在这样做之前,你应该仔细考虑是否要使用check_exists(没有这个问题就应该消失).正如core/validators.py自己所说,
"这个
URLFieldverify_exists论点存在难以解决的安全性和性能问题.因此,它已被弃用."
您会发现Django的开发版本确实完全处理了这个功能.
| 归档时间: |
|
| 查看次数: |
1743 次 |
| 最近记录: |