1

我有一个模型需要存储将成为 Django 环境的一部分的 URL。如果我存储的是普通 URL,我会使用models.URLField, 并使用verify_exists来确保 URL 确实存在。

但是,这在开发中效果不佳,因为开发服务器是单线程的,它会无限期地挂起,因为它不能一次处理两个请求。

我希望使用 来做某事,但是在将该文档页面末尾的函数调整为不接受请求的版本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

你对使用django 测试客户端很满意吗?

如果是这样,应该这样做:

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 回答
0

只是一个疯狂的想法,不确定它是否会有所帮助。您是否考虑过命名网址并使用reverse()Reverse如果 URL 有效,它将工作,如果不是,则会失败。

于 2010-08-10T17:13:07.437 回答