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 ... #
我喜欢这个,很干净。非常感谢。