URLが存在するかどうかをdjangoにチェックインし、存在する場合は画面に何かを表示したい、つまり:
if URL_THAT_POINTS_TO_SOME_PDF exists
SHOW_SOMETHING
URLが存在するかどうかをdjangoにチェックインし、存在する場合は画面に何かを表示したい、つまり:
if URL_THAT_POINTS_TO_SOME_PDF exists
SHOW_SOMETHING
編集:これは、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のドキュメントで作成する方法を確認できます。
それがあなたのスタートであることを願っています。
問題
from django.core.validators import URLValidator
www.google.ro
それは無効だと言います。私の見方では、これは間違っています。または少なくとも十分ではありません。
それを解決する方法は?
手がかりは、のソースコードをmodels.URLField
調べることです。これは、バリデーターとして使用されていることがわかりますforms.FormField
。URLValidator
上から以上のことをする
解決
url
likehttp://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
これは便利だと思いました。多分それは他の誰かを助けます。
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
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://
。それは仕様によるものなのだろうか。
追加が必要でした:
django.core.exceptionsからimportValidationError
それが私のために働くために。ただ言う;0)
私はここで答えを見ていません。それは他の誰かに役立つかもしれません。
from django import forms
f = forms.URLField()
try:
f.clean(http://example.com)
print "valid url"
except:
print "invalid url"
参照: 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")