Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中,如何确保特定用户正在访问视图?_Python_Django_Authentication - Fatal编程技术网

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

Python 在django中,如何确保特定用户正在访问视图?,python,django,authentication,Python,Django,Authentication,我希望能够检查访问页面的用户是否是特定用户 例如,当用户访问我的博客应用程序上的“编辑帖子”页面时,我希望确保该用户是帖子的作者 #/Blog/urls.py urlpatterns = [ ... path('Edit/<int:pk>', views.BlogEdit, name='BlogEdit'), ... ] #/Blog/views.py @permission_required('blog.change_post', login_ur

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

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

#/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})
目前,我检查访问“/Blog/Edit/”的用户是否具有Blog.change\u post权限

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

我想要的是一个@user\u passes\u测试函数,它根据帖子的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})
#/Blog/url.py
URL模式=[
...
路径('Edit/',views.BlogEdit,name='BlogEdit'),
...
]
#/Blog/views.py
@需要权限('blog.change\u post',login\u url='/Portal/login')
def博客编辑(请求,主键):
post=获取对象或404(post,pk=pk)
如果request.method==“POST”:
form=PostForm(request.POST,instance=POST)
如果form.is_有效():
post=form.save(commit=False)
post.save()
返回重定向('/Blog',pk=post.pk)
其他:
form=PostForm(实例=post)
返回呈现(请求'Blog/Edit.html',{'form':form})

您可以向
获取对象或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})
@需要权限('blog.change\u post',login\u url='/Portal/login')
def博客编辑(请求,主键):
post=获取对象或404(post,pk=pk,author=request.user)
如果request.method==“POST”:
form=PostForm(request.POST,instance=POST)
如果form.is_有效():
form.save()
返回重定向('/Blog',pk=post.pk)
其他:
form=PostForm(实例=post)
返回呈现(请求'Blog/Edit.html',{'form':form})
这里的
author
是从
Post
到用户模型的假设
ForeignKey
。可能名称不同,但想法仍然相同

因此,这意味着如果
pk
Blog
pk
,而
请求的
用户
不是
作者
,那么我们将得到404响应

这里过滤的优点是,我们使用单个查询进行过滤。我们不会(懒洋洋地)加载
作者
来检查它是否与登录用户相同

注意
post=form.save(commit=False)
post.save()
等同于
post=form.save()
(因此使用
commit=True


在基于类的视图中,将
get\u 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)
我最终从中找到了答案。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 ... #

我喜欢这个,很干净。非常感谢。