在Django中,如何确保特定用户正在访问视图?

2024-10-01 13:39:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想能够检查,如果用户访问一个页面是一个特定的用户。你知道吗

例如,当用户访问我博客应用程序上的“编辑文章”页面时,我希望确保该用户是文章的作者。你知道吗

当前,我检查访问“/Blog/Edit//”的用户是否具有blog.change\u文章许可。你知道吗

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

我想要的是一个@user\u passes\u test函数,它根据post的author属性检查访问视图的用户对象。你知道吗

#/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})

Tags: 用户form权限编辑request文章blog页面
3条回答

在基于类的视图中,将get_queryset方法更改为按当前用户筛选。你知道吗

class MyView(LoginRequiredMixin, UpdateView):
    ...

    def get_queryset(self):
        """
        Only the current logged in user can edit ... 
        """
        return super().get_queryset().filter(created_by=self.request.user)

您可以向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是从Post到用户模型的假设ForeignKey。可能名字不一样,但想法还是一样的。你知道吗

这意味着如果pkBlogpk,而request.user不是author,那么我们将得到404响应。你知道吗

这里过滤的优点是,我们使用单个查询进行过滤。我们不会(延迟地)加载author来检查它是否与登录的用户相同。你知道吗

Note: post = form.save(commit=False) and post.save() are equivalent to post = form.save() (so with commit=True).

我最终从This Post中找到了答案。urbanspaceman的建议适用于基于类的视图,但对于基于函数的视图,您可以执行以下操作:

@permission_required('blog.change_post', login_url='/Portal/login')
def BlogEdit(request, pk):
    post = get_object_or_404(Post, pk=pk)

    if post.author != request.user:
        raise Http404("You are not allowed to edit this Post")

    # ... Rest of view here ... #

相关问题 更多 >