0

Django 文档似乎非常明确,必须重定向 POST。我对这一切都很陌生,当我部署时,我并不渴望被黑客入侵。我的问题是:以下视图是否可以利用?当 post.cleaned_data 有效时,我会重定向。当它无效时,我是否还需要重定向?此外,像这样的“递归”视图是否包含任何安全漏洞?

def detail(request, blog_id):
    b = get_object_or_404(Blog, pk=blog_id)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            poster = form.cleaned_data['poster']
            comment = form.cleaned_data['comment']
            comment_date = timezone.now()
            b.comment_set.create(poster=poster, comment_date=comment_date, comment=comment)
            return HttpResponseRedirect(reverse('blog:detail', args=(b.id,)))
        else:
            return render(request, 'blog/detail.html', {
                'blog': b,
                'form': form,
                })
    form = CommentForm()
    return render(request, 'blog/detail.html', {
            'blog': b,
            'form': form,
        })

此外,对于那些有测试经验的人,您介意描述一下我应该采取哪些步骤来完全测试这个视图吗?我知道如何测试状态码。我还测试了 post 方法,并想知道如何查看整个重定向链(例如 post 被调用,并返回一个 HttpResponseRedirect 但 self.client.post 停在那里,我想继续下一个调用它在视图结束时递归返回获取请求。提前感谢您的输入。

4

2 回答 2

2

成功发布后重定向不是 Django 特有的——它只是适用于任何 Web 应用程序的良好实践,无论语言/技术如何。而且这里没有太多的“安全”问题,您只是想避免用户在刷新页面时一次又一次地发布相同的内容。

照原样,您的视图几乎是规范的 edit_or_create 视图 - cf mariodev 对改进代码布局的回答,但从纯粹的功能性 POV 来看,这完全是一回事。

如何测试重定向等已完整记录。

于 2013-10-16T11:23:42.610 回答
0

当表单无效时,您需要重新渲染视图,当您传递相同的表单对象时,它会自动显示错误,因此在这种情况下无需重定向,这是您使视图更干净的方法:

def detail(request, blog_id):
    b = get_object_or_404(Blog, pk=blog_id)

    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            poster = form.cleaned_data['poster']
            comment = form.cleaned_data['comment']
            comment_date = timezone.now()
            b.comment_set.create(poster=poster, comment_date=comment_date, comment=comment)
            return HttpResponseRedirect(reverse('blog:detail', args=(b.id,)))
    else:
        form = CommentForm()

    return render(request, 'blog/detail.html', {
            'blog': b,
            'form': form,
        })

关于测试,要通过重定向,您需要follow在 post 方法中添加参数(默认设置为 False):

c.post('/login/', {'name': 'fred', 'passwd': 'secret'}, follow=True)
于 2013-10-16T11:14:31.583 回答