1

Django 環境の一部となる URL を保存する必要があるモデルがあります。通常の URL を保存する場合はmodels.URLField、 と を使用verify_existsして、URL が実際に存在することを確認します。

ただし、開発サーバーはシングルスレッドであるため、これは開発ではうまく機能しません。一度に 2 つの要求を処理できないため、無期限にハングします。

を使用して何かをしたいと思っていましたが、そのドキュメントページの最後にある関数をリクエストを受け取らないバージョンにresolve()適応させるのに苦労しています。これは、特定のローカル URL が解決され、myview空のセッションから 404 が発生しています。

次のようなバリデーターでこれを行うことを望んでいました。

def validate_local_url(value):
    try:
        view, args, kwargs = resolve(value)
        view(*args, **kwargs)
    except Resolver404:
        raise ValidationError(u'%s is not a local URL (not a valid URL)' % value)
    except Http404:
        raise ValidationError(u'%s is not a local URL (does not exist)' % value)

ただし、有効なrequestオブジェクトが に渡されないと、これは失敗しkwargsます。ダミー (空白) のリクエスト オブジェクトを生成するにはどうすればよいですか? 使ってみただけdjango.http.HttpRequestです。

4

2 に答える 2

0

参考になるかどうかわかりませんが、勝手な考えです。URLに名前を付けて使用することを検討しましたreverse()か? ReverseURL が有効な場合は機能し、そうでない場合は失敗します。

于 2010-08-10T17:13:07.437 に答える
0

django test Clientの使用に慣れていますか?

もしそうなら、これはそれを行うべきです:

from django.test.client import Client

def validate_local_url(path):
    c = Client()
    try:
        resp = c.get(path)
        if resp.status_code == 404:
            raise ValidationError(u'%s is not a local URL (does not exist)' % value)
    except:
        raise ValidationError(u'%s is not a local URL (not a valid URL)' % value)

ただ、ご存知のように、ローカルリクエストによって呼び出されるvalidate_local_urlことのないGET死のペナルティの下で確認してください。そうしないと、誰かがあなたのサーバーを無限ループに簡単に設定できます:

# urls.py
url('^infinite_loop/$', 'myapp.infinite_loop', 'infinite_loop')

#views.py
def infinite_loop_view(request, template_name="blah.html", form_class=MyForm):
    my_form = form_class(request.REQUEST or None) # yes, admittedly this is dumb
    if my_form.is_valid():
        return HttpResponse("Congratulations! Your path was totally valid.")
    return render_to_response(template_name, locals(), RequestContext(request))

その後:

http://example.com/infinite_loop/?path_field=infinite_loop

于 2010-08-10T18:17:42.360 に答える