2011-04-08 11 views
6

誰かがURLFieldのDjangoから生成されたフォームでこのURL http://www.nacolmeia.com.br/do/Home/oferta/EnERが受け入れられない理由を教えてください。DjangoのURLフィールドテストで問題が発生しました

:)

おかげ

+0

この特定のケースには関係ありませんが、HEAD要求を拒否した場合、djangoは無効と見なします。例えば、wix.com(www.wehaveavoice.org.uk)が主催するもの。 – Julian

答えて

7

あなたはそれを検証しようとしている同じサーバーからサイトをホスティングしていますか? 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() 
+0

それ以上のテストでは、問題はキャップ文字であることがわかりました。 – Rodrogo

+0

どういう意味ですか?あなたはすべての文字を小文字にしてもうまくいきますか? – DTing

+0

はい。 (申し訳ありませんが、第二言語の英語ユーザー)。 URLを小文字にすると、フォームがそれを受け入れました。 – Rodrogo

0

私はこの問題を発見したと思います。あなたはこのURLを開くと:

http://www.nacolmeia.com.br/do/Home/oferta/EnER/piracicaba/a-pascoa-chegou-na-planet-chokolate!-50-off-para-1-caixa-com-16-bombons-recheados--1-pao-de-mel-recheado-ou-1-caixa-com-16-trufas-recheadas--1-pao-de-mel-recheado-de-rs-47.10-por-rs-23.55

http://www.nacolmeia.com.br/do/Home/oferta/EnER

は...それはこのURLに再度指示します。

最初のURLは問題ありませんが、リダイレクトされたURLは247文字です。 models.fields.URLFieldmax_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が気にするので、それは検証をパスします。それはウェブページをロードするかしないか?

+0

これに別のメモを追加するだけです:urllib2にはデフォルトでクッキーハンドラが含まれていないため、 "verify_exists"の場合、 "cookie only if cookie"ビジネスは変な動作をします。 –

関連する問題