python - 在 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})
解决方案
您可以向您的 : 添加一个额外的过滤器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
的假设。名称可能不同,但想法仍然相同。ForeignKey
Post
因此,这意味着如果a不是 a 的 a pk
,那么我们将得到 404 响应。pk
Blog
request.user
author
此处过滤的优点是我们使用单个查询进行过滤。我们不会(懒惰地)加载author
来检查它是否与登录用户相同。
注意:
post = form.save(commit=False)
andpost.save()
等价于post = form.save()
(so withcommit=True
)。
推荐阅读
- java - java并发在map值上同步
- ios - 如何减小我的 ipa 构建大小?
- php - Mysql 转义 ' 和 \
- bash - bash:模式 x 和 y 之间的分隔线块
- c++ - 如何使用 uin8_t 数组分配结构?
- java - 地图列表
使用 Mapstruct 从 Java POJO 到 Protobuf (proto3) - dependency-management - 即使在独立任务失败后如何运行依赖任务?
- regex - Postgres 9.5 中使用 regexp_replace 的正向 Lookbehind
- jenkins - 在詹金斯中获取父作业的内部版本号而不是提升的内部版本号
- reactjs - ReactJS 最流行的后端框架是什么?