首页 > 解决方案 > 在 django 中,如何确保特定用户正在访问视图?

问题描述

我希望能够检查访问页面的用户是否是特定用户。

例如,当用户访问我的博客应用程序上的“编辑帖子”页面时,我想确保该用户是帖子的作者。

目前,我检查访问“/Blog/Edit//”的用户是否具有 blog.change_post 权限。

但是,如果第二个用户(也具有该权限)输入 URL 以更改其他人的帖子,他们将通过该权限检查并能够编辑其他人的帖子。

我想要的是一个@user_passes_test 函数,它检查用户对象是否根据帖子的作者属性访问视图。

#/Blog/urls.py

urlpatterns = [
    ...
    path('Edit/<int:pk>', views.BlogEdit, name='BlogEdit'),
    ...
]



#/Blog/views.py

@permission_required('blog.change_post', login_url='/Portal/login')
def BlogEdit(request, pk):
post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            return redirect('/Blog', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'Blog/Edit.html', {'form': form})

标签: pythondjangoauthentication

解决方案


您可以向您的 : 添加一个额外的过滤器get_object_or_404

@permission_required('blog.change_post', login_url='/Portal/login')
def BlogEdit(request, pk):
    post = get_object_or_404(Post, pk=pk, author=request.user)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            return redirect('/Blog', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'Blog/Edit.html', {'form': form})

这是从到用户模型author的假设。名称可能不同,但想法仍然相同。ForeignKeyPost

因此,这意味着如果a不是 a 的 a pk,那么我们得到 404 响应。pkBlogrequest.userauthor

此处过滤的优点是我们使用单个查询进行过滤。我们不会(懒惰地)加载author来检查它是否与登录用户相同。

注意: post = form.save(commit=False)andpost.save()等价于post = form.save()(so with commit=True)。


推荐阅读