2010-07-03 20 views
16

मैं Django में जांच करने के लिए अगर एक यूआरएल मौजूद है चाहता हूँ और मैं स्क्रीन पर कुछ, यानी दिखाना चाहते हैं यह करता है:मैं कैसे जांच सकता हूं कि Django के वैधकर्ताओं के साथ कोई URL मौजूद है या नहीं?

if URL_THAT_POINTS_TO_SOME_PDF exists 
    SHOW_SOMETHING 

उत्तर

45

संपादित करें: कृपया ध्यान दें, यह अब ऊपर Django के किसी भी संस्करण के लिए मान्य है 1.5

मुझे लगता है आप अगर फ़ाइल वास्तव में, मौजूद है सिर्फ एक वस्तु (जो सिर्फ एक सरल है अगर बयान)

सबसे पहले, मैं हमेशा की सिफारिश करेंगे Django के स्रोत कोड के माध्यम से देख नहीं है नहीं करता है, तो जाँच करने के लिए चाहते हैं, क्योंकि आप find some great code कर सकते हैं जो आप कर सकते हैं उपयोग करें :)

मुझे लगता है कि आप इसे एक टेम्पलेट के भीतर करना चाहते हैं। यूआरएल को प्रमाणित करने के लिए कोई अंतर्निहित टेम्पलेट टैग नहीं है लेकिन आप परीक्षण के लिए टेम्पलेट टैग के भीतर उस URLValidator कक्षा का अनिवार्य रूप से उपयोग कर सकते हैं। सीधे शब्दों में:

from django.core.validators import URLValidator 
from django.core.exceptions import ValidationError 

validate = URLValidator(verify_exists=True) 
try: 
    validate('http://www.somelink.com/to/my.pdf') 
except ValidationError, e: 
    print e 

URLValidator वर्ग ValidationError थूक से बाहर जब यह लिंक नहीं खोल सकता होगा। यह वास्तव में अनुरोध खोलने के लिए urllib2 का उपयोग करता है, इसलिए यह केवल मूल रेगेक्स जांच का उपयोग नहीं कर रहा है (लेकिन यह भी करता है।)

आप इसे एक कस्टम टेम्पलेट टैग में डाल सकते हैं, जिसे आप django दस्तावेज़ों में कैसे बनाना है, और तुम जाओगे।

आशा है कि यह आपके लिए शुरुआत है।

+19

'verify_exists' [सुरक्षा के लिए हटा दिया] है (https://docs.djangoproject.com/en/1.4/ref /models/fields/#django.db.models.URLField.verify_exists) कारणों को डीजेगो 1.5 – Yohann

+0

में हटा दिया गया है क्योंकि django 1.5, verify_exists तर्क को हटा दिया गया है/हटा दिया गया है, अब आप एक यूआरएल अस्तित्व के लिए सत्यापित नहीं कर सकते हैं, अब यह अभी वैध यूआरएल –

+0

[इंटरनेट संग्रह में वंचित चेतावनी लिंक] के लिए एक सरल रेगेक्स मैच (https://web.archive.org/ वेब/20150907152504/https: //docs.djangoproject.com/en/1.4/ref/models/fields/#django.db.models.URLField.verify_exists) – luckydonald

2

यह एक अतिरिक्त ले लिया:

django.core.exceptions से आयात ValidationError

यह मेरे लिए काम करने के लिए। बस कह; 0)

1
from django.core.validators import URLValidator 
from django.core.exceptions import ValidationError 

validate = URLValidator(verify_exists=True)  
value = request.GET.get('url', None) 

if value:   
    try: 
     validate(value) 
    except ValidationError, e: 
     print e 

validate(value) विफल रहता है यूआरएल http:// की तरह एक स्कीमा के साथ preceeded नहीं है। मुझे आश्चर्य है कि क्या यह डिजाइन द्वारा है।

4

कुछ भी django.core.validators.URLValidator को verify_exists पैरामीटर के आधार पर Django 1.5 के साथ काम करना बंद कर देगा - the documentation काम आते हुए इस बारे में कुछ नहीं कहना है, लेकिन source code पता चलता है कि 1.4 (नवीनतम स्थिर संस्करण) में है कि तंत्र का उपयोग कर एक DeprecationWarning की ओर जाता है (आप करेंगे it has been removed completely in the development version देखें):

if self.verify_exists: 
    import warnings 
    warnings.warn(
     "The URLField verify_exists argument has intractable security " 
     "and performance issues. Accordingly, it has been deprecated.", 
     DeprecationWarning 
     ) 

वहाँ भी इस तथ्य से संबंधित इस विधि के साथ कुछ अजीब quirks हैं कि यह URL की जांच करने के लिए एक HEAD अनुरोध का उपयोग करता है -, बैंडविड्थ कुशल यकीन है, लेकिन कुछ साइटों (अमेज़न) की तरह एक साथ जवाब त्रुटि (HEAD, जहां बराबर है ivalent GET ठीक रहेगा), और यह false negative results from the validator की ओर जाता है।

मैं भी (दो साल में बहुत कुछ बदल गया है) एक टेम्पलेट में urllib2 के साथ कुछ भी करने के खिलाफ अनुशंसा करता हूं - यह संभावित रूप से लंबे समय से चलने वाले संचालन को ट्रिगर करने के लिए अनुरोध/प्रतिक्रिया चक्र का गलत हिस्सा है: विचार करें कि क्या होता है यदि यूआरएल मौजूद है, लेकिन एक DNS समस्या urllib2 का कारण बनने के लिए 10 सेकंड लेने का कारण बनती है। BAM! आपके पृष्ठ लोड पर तत्काल 10 अतिरिक्त सेकंड।

मैं इस असीमित (और इस प्रकार पृष्ठ लोड को अवरुद्ध नहीं कर सकता) संभवतः लंबे समय से चलने वाले कार्यों को बनाने के लिए वर्तमान सर्वोत्तम अभ्यास कहूंगा django-celery का उपयोग कर रहा है; a basic tutorial है जो वेबसाइट देखने के लिए pycurl का उपयोग करके कवर करता है, या आप Lanyrd पर इसी उद्देश्य के लिए how Simon Willison implemented celery tasks (स्लाइड 32-41) देख सकते हैं।

0

मैंने यहां जवाब नहीं देखा है। यह किसी और के लिए सहायक हो सकता है।

from django import forms 
f = forms.URLField() 
try: 
    f.clean(http://example.com) 
    print "valid url" 
except: 
    print "invalid url" 
+0

मैं एक समान एवरवर लगाने जा रहा था। आपके पास अच्छी कोशिश थी, लेकिन यह पर्याप्त नहीं है। –

1

समस्या

from django.core.validators import URLValidator का कहना है कि www.google.ro अमान्य है। जो मेरे दृष्टिकोण में गलत है। या कम से कम पर्याप्त नहीं है।

इसे कैसे हल करें?

सुराग models.URLField के लिए स्रोत कोड को देखना है, तो आप देखेंगे कि यह forms.FormField को एक सत्यापनकर्ता के रूप में उपयोग करता है। करता है से अधिक URLValidator से

ऊपर

समाधान

अगर मैं http://www.google.com की तरह एक url या www.google.ro की तरह मान्य करने के लिए चाहते हैं, मैं निम्नलिखित करना होगा:

django.forms से URLField आयात

def validate_url(url): 
    url_form_field = URLField() 
    try: 
     url = url_form_field.clean(url) 
    except ValidationError: 
     return False 
    return True 

मुझे यह उपयोगी मिला। शायद यह किसी और की मदद करता है।

0

देखें: http://www.agmweb.ca/2009-04-19-django-urlpatterns---its-more-than-just-urls/

Django 1.10 में मैं अब का उपयोग करें:

from django.core.urlresolvers import RegexURLResolver, Resolver404 

if 'next' in request.GET.keys(): 
    n = request.GET["next"].strip('/') + "/" 
    resolver = RegexURLResolver(r'', urls) 
    try: 
     callback, callback_args, callback_kwargs = resolver.resolve(n) 
     return HttpResponseRedirect(str(request.GET["next"])) 
    except Resolver404: 
     raise PermissionDenied("This page is not available") 
संबंधित मुद्दे

 संबंधित मुद्दे