19

URLが存在するかどうかをdjangoにチェックインし、存在する場合は画面に何かを表示したい、つまり:

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 URLValidatorwww.google.roそれは無効だと言います。私の見方では、これは間違っています。または少なくとも十分ではありません。

それを解決する方法は?

手がかりは、のソースコードをmodels.URLField調べることです。これは、バリデーターとして使用されていることがわかりますforms.FormFieldURLValidator上から以上のことをする

解決

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パラメータに基づくものはすべてDjango1.5でのdjango.core.validators.URLValidator動作を停止します—ドキュメントにはこれについて何も書かれていませんが、ソースコードは、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
        )

このメソッドには、HEADリクエストを使用してURLをチェックするという事実に関連する奇妙な癖もあります。帯域幅効率は確かですが、一部のサイト(Amazonなど)はエラーで応答します(にHEAD、同等のものでGET問題ありませんでした) 、これはバリデーターからの偽陰性の結果につながります。

また、(2年間で大幅に変更されましたが)テンプレートで何かを行うことはお勧めしませurllib2ん。これは、実行が長くなる可能性のある操作をトリガーする要求/応答サイクルの完全に間違った部分です。URLが存在する場合はどうなるかを検討してください。 、ただし、DNSの問題により、問題が解決するurllib2までに10秒かかります。バム!ページの読み込みに10秒余分にかかります。

このような非同期の(したがってページの読み込みをブロックしない)実行時間の長いタスクを作成するための現在のベストプラクティスは、django-celery;を使用していると言えます。ウェブサイトをチェックするために使用することをカバーする基本的なチュートリアルがあります、またはあなたはサイモンウィリソンがLanyrdで同様の目的のためにセロリタスク(スライド32-41)をどのように実装したかを調べることができます。pycurl

于 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からimportValidationError

それが私のために働くために。ただ言う;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 に答える