【问题标题】:Django resolve with GET parameters — raises Resolver404()Django 使用 GET 参数解析 — 引发 Resolver404()
【发布时间】:2015-07-15 12:11:08
【问题描述】:

我需要测试重定向到 url 是否会导致 404 错误。 以下 django 文档中的示例:https://docs.djangoproject.com/en/1.8/ref/urlresolvers/#resolve

我设法让以下工作。因此,如果redirect_url 引发 404,我们会将用户重定向到主页。

redirect_url = '/blog/hello-world'

view, args, kwargs = resolve()
kwargs['request'] = request
try:
    view(*args, **kwargs)
except Http404:
    self.message_user(...)
    return HttpResponseRedirect('/')

但是我需要测试带有?edit GET 参数的redirect_url 是否也会引发404。因为“编辑”标志用于返回不同的查询集。例如

    if 'edit' in request.GET:
        qs = qs.drafts()
    else:
        qs = qs.public()

我更改了我的原始代码:

redirect_url = '%s?edit' % redirect_url
[...]

但是这会引发 Resolver404

此处的完整堆栈跟踪:http://dpaste.com/1DQHH7Q

现在我的问题是如何使用 GET 参数测试 HTTP404 错误?

路径blog/2015/07/14/sky-limit-only-those-who-arent-afraid-fly/?edit 是有效的,当我在浏览器中访问 url 时......它按预期工作。

一个肮脏的解决方案是这样做:

 from django.test.client import Client

 client = Client()
 resp = client.get(redirect_url)
 if not resp.status_code == 404:
    return HttpResponseRedirect(redirect_url)

我真的不想用这个。

【问题讨论】:

    标签: django django-views django-urls


    【解决方案1】:

    resolve() 方法采用不带 GET 参数的 url。您可以尝试替换request.GET

    redirect_url = '/blog/hello-world'
    view, args, kwargs = resolve()
    request.GET = {'edit': ''}
    kwargs['request'] = request
    try:
        view(*args, **kwargs)
    except Http404:
        self.message_user(...)
        return HttpResponseRedirect('/')
    

    请注意,request 是您当前视图的请求对象,因此如果您需要实际的 request.GET 数据,请小心谨慎。

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 2011-01-15
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多