Django的URL字段测试问题

Rod*_*ogo 7 django django-models

请问有人请说明为什么这个URL http://www.nacolmeia.com.br/do/Home/oferta/EnER不会被从URLField的Django生成的表单中接受?

:)

谢谢

DTi*_*ing 8

您是否在尝试验证它的同一台服务器上托管该网站? docs

请注意,当您使用单线程开发服务器时,验证由同一服务器提供服务的URL将挂起.对于多线程服务器,这应该不是问题.

它看起来不像它在表单级别的失败验证

>>> from django import forms
>>> f = forms.URLField()
>>> f.clean('http://www.nacolmeia.com.br/do/Home/oferta/EnER')
u'http://www.nacolmeia.com.br/do/Home/oferta/EnER'
>>> f.clean('sadfas')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/dev/.virtualenvs/thepidb/lib/python2.7/site-packages/django/forms/fields.py", line 171, in clean
    self.run_validators(value)
  File "/home/dev/.virtualenvs/thepidb/lib/python2.7/site-packages/django/forms/fields.py", line 160, in run_validators
    raise ValidationError(errors)
ValidationError: [u'Enter a valid URL.']
>>> 
Run Code Online (Sandbox Code Playgroud)

如果您不需要在models.py中验证网站没有返回404

url = models.URLField(verify_exists=False)
Run Code Online (Sandbox Code Playgroud)

编辑:

在django源代码中进行了一些挖掘here并且有些东西搞乱后,我仍然不确定为什么带有caps的URL导致重定向循环.

>>> from django.core.validators import URLValidator
>>> u = URLValidator(verify_exists=True)
>>> u.__call__('http://www.nacolmeia.com.br/do/Home/oferta/EnER')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/dev/.virtualenvs/thepidb/lib/python2.7/site-packages/django/core/validators.py", line 105, in __call__
    raise broken_error
ValidationError: [u'This URL appears to be a broken link.']
>>> u.__call__('http://www.nacolmeia.com.br/do/home/oferta/ener')
>>> 
Run Code Online (Sandbox Code Playgroud)

引发的实际异常是HTTPError:

  File "/usr/lib/python2.7/urllib2.py", line 606, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python2.7/urllib2.py", line 398, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 511, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 430, in error
    result = self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 370, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 606, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python2.7/urllib2.py", line 398, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 511, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 430, in error
    result = self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 370, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 596, in http_error_302
    self.inf_msg + msg, headers, fp)
HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
Found
>>> 
Run Code Online (Sandbox Code Playgroud)

这里有一些关于HTTPError的帖子:herehere

好像它与cookies有关,但我无法提供一个好的解释,我会把它留给其他人.

如果您不想关闭验证但不关心URL的大小写,则可能有效的解决方法是覆盖表单的clean_field方法.

def clean_your_url_field(self):
    return self.cleaned_data['your_url_field'].lower()
Run Code Online (Sandbox Code Playgroud)