2011-04-08 38 views
6

Có thể ai đó vui lòng làm rõ cho tôi biết tại sao url này http://www.nacolmeia.com.br/do/Home/oferta/EnER không được chấp nhận trong biểu mẫu được tạo từ Django của URLField?Sự cố với Kiểm tra trường URL của Django

:)

Cảm ơn

+0

Không liên quan đến trường hợp cụ thể này, nhưng tôi đã tìm thấy các url django deems không hợp lệ nếu chúng từ chối yêu cầu HEAD. Ví dụ: mọi thứ được lưu trữ bởi wix.com (www.wehaveavoice.org.uk). – Julian

Trả lời

7

Bạn đang lưu trữ các trang web từ cùng một máy chủ bạn đang cố gắng để xác nhận nó trên? 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.

Nó không giống như xác nhận thất bại của mình ở mức độ hình thức

>>> 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.'] 
>>> 

Nếu bạn không cần phải xác nhận rằng trang web không trả lại 404, trong mô hình của bạn. py

url = models.URLField(verify_exists=False) 

chỉnh sửa:

sau khi một số đào xung quanh trong mã nguồn django here và một số rối tung xung quanh với vỏ, tôi vẫn không chắc chắn lý do tại sao URL có mũ đang gây ra một vòng lặp chuyển hướng.

>>> 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') 
>>> 

Ngoại lệ thực tế được nêu ra là một 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 
>>> 

đây là một số bài viết nói về HTTPError: herehere

có vẻ như nó có cái gì để làm với các tập tin cookie, nhưng Tôi không thể đưa ra một lời giải thích tốt, tôi sẽ để lại lời giải thích cho người khác.

Giải pháp thay thế có thể hoạt động nếu bạn không muốn tắt xác thực nhưng không quan tâm đến việc viết hoa các url của bạn là ghi đè phương thức clean_field của biểu mẫu.

def clean_your_url_field(self): 
    return self.cleaned_data['your_url_field'].lower() 
+0

Thử nghiệm tiếp theo cho thấy vấn đề là các ký tự mũ ... Nếu đó là cách này? – Rodrogo

+0

ý của bạn là gì? nó hoạt động nếu bạn viết thường tất cả các chữ cái? – DTing

+0

Có. (xin lỗi, người sử dụng tiếng Anh thứ hai). Khi URL được đặt ở dạng chữ thường, biểu mẫu chấp nhận nó. – Rodrogo

0

Tôi nghĩ rằng tôi đã tìm thấy sự cố. Khi bạn mở URL này:

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

... nó lại hướng đến URL này:

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.

URL đầu tiên là tốt, nhưng URL được định hướng lại dài 247 ký tự. Đây không phải là vấn đề, ngoại trừ models.fields.URLFieldmax_length mặc định là ký tự. Vì vậy, nó không xác nhận vì nó quá dài.

Thay vào đó, hãy tăng max_length và nó sẽ hoạt động: models.URLField(max_length=255) Để biết thông tin về URL dài nhất có thể, see this SO question. Nó chắc chắn dài hơn 200 ký tự.

EDIT: Nó chỉ chuyển hướng lại đến URL thứ hai khi đặt cookie! Nếu bạn truy cập lại cùng một trang với một cookie hiện có, nó sẽ chỉ hiển thị URL ngắn hơn.


Nhưng URL của chữ thường thì sao? Nó xuất hiện máy chủ web của bạn là trường hợp nhạy cảm liên quan đến URL, và phiên bản chữ thường:

http://www.nacolmeia.com.br/do/home/oferta/ener

... sẽ hiển thị một trang lỗi chung chung. Nó không chuyển hướng đến URL của ký tự 247. Vì vậy, điều đó đi qua xác nhận vì điều duy nhất models.URLField quan tâm là; nó có tải trang web hay không?

+0

Chỉ cần thêm một ghi chú khác : Doanh nghiệp "chuyển hướng chỉ khi cookie" hoạt động bất thường đối với 'verify_exists' vì urllib2 không bao gồm trình xử lý cookie theo mặc định. –

Các vấn đề liên quan