如何检查Django验证器是否存在URL?

Dan*_*nos 19 django url url-validation

我想检查django是否存在URL,如果存在,我想在屏幕上显示某些内容,即:

if URL_THAT_POINTS_TO_SOME_PDF exists 
     SHOW_SOMETHING
Run Code Online (Sandbox Code Playgroud)

Bar*_*tek 48

编辑:请注意,这不再适用于1.5以上的任何版本的Django

我假设您要检查文件是否确实存在,而不是只有一个对象(这只是一个简单的if语句)

首先,我建议总是查看Django的源代码,因为你会发现一些很棒的代码,你可以使用:)

我假设您想在模板中执行此操作.没有用于验证URL的内置模板标记,但您实际上可以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
Run Code Online (Sandbox Code Playgroud)

URLValidator课程将吐出ValidationError时,它无法打开链接.它用于urllib2实际打开请求,因此它不仅仅使用基本的正则表达式检查(但它也会这样做.)

您可以将其添加到自定义模板标记中,您将了解如何在django文档中创建,然后离开.

希望这是一个开始.

  • `verify_exists`是[为安全而弃用](https://docs.djangoproject.com/en/1.4/ref/models/fields/#django.db.models.URLField.verify_exists)的原因,已在Django 1.5中删除 (23认同)
  • [互联网档案中废弃的警告链接](https://web.archive.org/web/20150907152504/https://docs.djangoproject.com/en/1.4/ref/models/fields/#django.db.models. URLField.verify_exists) (2认同)

Mih*_*fir 9

问题

from django.core.validators import URLValidator说那www.google.ro是无效的。在我看来这是错误的。或者至少还不够。

如何解决?

线索是查看 的源代码models.URLField,您将看到它forms.FormField用作验证器。哪个比URLValidator上面做的更多

解决方案

如果我想验证urllikehttp://www.google.com或 like 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
Run Code Online (Sandbox Code Playgroud)

我发现这很有用。也许它可以帮助别人。


sup*_*cuo 6

任何基于verify_exists参数的操作django.core.validators.URLValidator都将停止在Django 1.5上运行- 文档中对此一无所获,但是源代码显示,在1.4(最新的稳定版本)中使用该机制会导致DeprecationWarning(您将看到它已被删除)完全在开发版本中):

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
        )
Run Code Online (Sandbox Code Playgroud)

这种方法还存在一些奇怪的怪癖,这与它使用HEAD请求检查URL 的事实有关—带宽效率高,是肯定的,但是某些站点(如Amazon)响应时会出错(到HEAD,则等价即可GET) ,这会导致验证器产生错误的负面结果

我还要(两年中发生了很多变化)建议不要对urllib2模板执行任何操作-这完全是请求/响应周期中触发潜在的长期运行操作的错误部分:请考虑如果URL存在,会发生什么情况,但DNS问题导致urllib2需要10秒才能解决。AM!在页面加载时立即多出10秒。

我要说的是,使诸如此类的可能长时间运行的任务(从而不会阻塞页面加载)的当前最佳实践是使用django-celery;那里有一个基本的教程,涵盖了pycurl用于检查网站的内容,或者您​​可以研究Simon Willison如何在Lanyrd上以类似目的实现芹菜任务(幻灯片32-41)。