誰かがURLFieldのDjangoから生成されたフォームでこのURL http://www.nacolmeia.com.br/do/Home/oferta/EnER
が受け入れられない理由を教えてください。DjangoのURLフィールドテストで問題が発生しました
:)
おかげ
誰かがURLFieldのDjangoから生成されたフォームでこのURL http://www.nacolmeia.com.br/do/Home/oferta/EnER
が受け入れられない理由を教えてください。DjangoのURLフィールドテストで問題が発生しました
:)
おかげ
あなたはそれを検証しようとしている同じサーバーからサイトをホスティングしていますか? docs
Note that when you're using the single-threaded development server, validating a URL being served by the same server will hang. This should not be a problem for multithreaded servers.
あなたはウェブサイトがあなたのモデルで、404を返さないことを確認する必要がない場合は、フォームレベル
>>> 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.']
>>>
でその失敗の検証のようには見えません。 PY
url = models.URLField(verify_exists=False)
編集:
djangoのソースコードhere
をいくつか掘り下げた後、シェルを使いこなす人は、なぜか大文字の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')
>>>
提起されている実際の例外は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
>>>
はHTTPErrorの話をいくつかの記事です:それは、クッキーとは何かを持っているようhere
と
は見えますが、私は良い説明をすることができません、私はそれを他の人に任せます。
妥当性検査を無効にしたくない場合でも、URLの大文字小文字を気にせずに済む回避策は、フォームのclean_fieldメソッドをオーバーライドすることです。
def clean_your_url_field(self):
return self.cleaned_data['your_url_field'].lower()
私はこの問題を発見したと思います。あなたはこのURLを開くと:
http://www.nacolmeia.com.br/do/Home/oferta/EnER
は...それはこのURLに再度指示します。
最初のURLは問題ありませんが、リダイレクトされたURLは247文字です。 models.fields.URLField
にmax_length
があり、デフォルトでになることを除いて、これは問題ではありません。それは長すぎるため検証に失敗します。
代わりに、max_length
を増やすと動作します。models.URLField(max_length=255)
可能な限り最長のURLについては、see this SO questionをご覧ください。それは間違いなく200文字以上です。
EDIT:クッキーを設定するときに2番目のURLにのみリダイレクトされます。既存のCookieを使用して同じページに再度アクセスすると、短いURLが表示されます。
しかし小文字のURLはどうですか?あなたのウェブサーバがURLをに関して大文字と小文字が区別され表示され、小文字のバージョン:
http://www.nacolmeia.com.br/do/home/oferta/ener
...一般的なエラーページが表示されます。 247文字のURLにリダイレクトされません。だから、唯一のものmodels.URLFieldが気にするので、それは検証をパスします。それはウェブページをロードするかしないか?
これに別のメモを追加するだけです:urllib2にはデフォルトでクッキーハンドラが含まれていないため、 "verify_exists"の場合、 "cookie only if cookie"ビジネスは変な動作をします。 –
この特定のケースには関係ありませんが、HEAD要求を拒否した場合、djangoは無効と見なします。例えば、wix.com(www.wehaveavoice.org.uk)が主催するもの。 – Julian