Django项目中限制用户仅访问自身详情页面的问题
解决Django个人资料页面访问权限限制问题
要实现仅登录用户能访问自身详情页、禁止访问其他用户页面,只需在视图中添加URL用户名与当前登录用户的一致性校验,具体修改如下:
1. 修改views.py代码
在details函数开头增加权限判断逻辑,同时优化用户查询避免异常:
from django.shortcuts import get_object_or_404 from django.http import HttpResponseForbidden @login_required(login_url="signin") def details(request, username): # 校验URL中的用户名是否与当前登录用户一致 if username != request.user.username: # 不一致则返回403禁止访问,也可替换为重定向到用户自身详情页 return HttpResponseForbidden("无权访问该页面") # 重定向写法:return redirect("details", username=request.user.username) # 用get_object_or_404替代get,避免用户名不存在时抛出未捕获异常 user = get_object_or_404(User, username=username) form = Details() if request.method == "POST": form = Details(request.POST, request.FILES) if form.is_valid(): detail = form.save(commit=False) detail.username = request.user detail.save() return redirect(success, pk=detail.pk) else: form = Details(initial={"matricno":request.user.username}) return render(request, "details.html", {"form":form})
2. 逻辑说明
- 权限拦截:直接对比URL传入的
username和当前登录用户的request.user.username,不一致则拒绝访问。 - 异常防护:使用
get_object_or_404替代User.objects.get(),当URL输入不存在的用户名时,自动返回404页面,避免服务器报错。 - 响应可选:可根据需求选择返回403提示页,或直接重定向到用户自身的详情页,提升体验。
额外简化方案(可选)
如果用户仅需访问自身页面,可直接去掉URL中的用户名参数,从根源避免篡改问题:
- 修改urls.py:
urlpatterns = [ path("details/", views.details, name="details"), ]
- 修改views.py(移除username参数):
@login_required(login_url="signin") def details(request): user = request.user form = Details() if request.method == "POST": form = Details(request.POST, request.FILES) if form.is_valid(): detail = form.save(commit=False) detail.username = request.user detail.save() return redirect(success, pk=detail.pk) else: form = Details(initial={"matricno":request.user.username}) return render(request, "details.html", {"form":form})
内容的提问来源于stack exchange,提问作者Olasubomi
相关产品推荐
相关产品推荐

