19

我想检查 django 是否存在 URL,如果存在,我想在屏幕上显示一些东西,即:

if URL_THAT_POINTS_TO_SOME_PDF exists 
     SHOW_SOMETHING
4

7 回答 7

52

编辑:请注意,这对于 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

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

您可以将其放入自定义模板标签中,您将在 django 文档中了解如何创建该标签,然后就可以使用了。

希望这对你来说是一个开始。

于 2010-07-03T04:00:33.723 回答
10

问题

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

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

于 2017-01-19T16:24:09.050 回答
6

任何基于verify_exists参数 to的东西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
        )

这种方法也有一些奇怪的怪癖,与它使用请求来检查 URL 相关的事实HEAD— 带宽效率,当然,但某些网站(如亚马逊)响应错误(到HEAD,等效的地方GET本来可以的) ,这会导致验证器的假阴性结果

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

我想说,目前制作可能长时间运行的任务的最佳实践是使用django-celery; 有一个基本教程涵盖pycurl了用于检查网站,或者您可以查看Simon Willison 如何在 Lanyrd 上实现类似目的的 celery 任务(幻灯片 32-41)。

于 2012-08-21T18:05:39.670 回答
2
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)如果 url 前面没有类似http://. 我想知道这是否是设计使然。

于 2012-05-17T05:37:04.953 回答
2

它需要一个额外的:

从 django.core.exceptions 导入 ValidationError

让它为我工作。只是说;0)

于 2010-07-29T20:24:50.833 回答
2

我在这里没有看到答案。它可能对其他人有帮助。

from django import forms
f = forms.URLField()
try:
    f.clean(http://example.com)
    print "valid url"
except:
    print "invalid url"
于 2016-11-23T07:17:55.993 回答
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")
于 2017-02-03T08:27:25.753 回答