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
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
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: here
và here
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()
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:
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.URLField
có max_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?
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. –
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