gpt4 book ai didi

Django:限制对 View 的访问,取决于引用 url

转载 作者:行者123 更新时间:2023-12-01 10:58:21 25 4
gpt4 key购买 nike

我正在制作一个学校记录网络应用程序。我希望员工用户能够通过转到正确的 url 查看任何学生的用户数据页面,但不允许学生访问彼此的页面。但是我对两个 url 使用相同的 View 函数。

我有一个工作 @user_is_staff 装饰器基于 user.staff 对象的存在。 Pupil 用户有一个 user.pupil 对象。自然地,它们是离散的,因为没有用户可以同时拥有 .staff.pupil 条目。

网址.py

(r'^home/(?P<subject>[^/]+)/$', 'myproject.myapp.views.display_pupil')
(r'^admin/user/(?P<user>\d+)/(+P<subject>[^/]+)/$', 'myproject.myapp.views.display_pupil')

View .py

@login_required
def display_pupil(request, subject, pupil=None):
if pupil:
try:
thepupil = get_object_or_404(Pupil, id = pupil, cohort__school = request.user.staff.school)
except Staff.DoesNotExist:
return HttpResponseForbidden()
else:
thepupil = request.user.pupil
thesubject = get_object_or_404(Subject, shortname = subject)
# do lots more stuff here
return render_to_response('pupilpage.html', locals(), context_instance=RequestContext(request))

这样做是可行的,但感觉很老套,特别是因为我的“@user_is_staff”装饰器比这里的 403 错误更优雅地重定向到登录页面。

我不知道的是如何仅在使用 pupil kwarg 访问函数时才将 @user_is_staff 装饰器应用于该函数。真正的 View 函数中有更多的代码,所以我不想再写一个,因为那将是严重的非 DRY。

最佳答案

听起来您想要两个单独的 View - 一个用于特定学生,一个用于当前用户 - 以及一个包含共享逻辑的实用函数。

@login_required:
def display_current_pupil(request, subject):
thepupil = request.user.pupil
return display_pupil_info(request, subject, thepupil)

@user_is_staff
def display_pupil(request, subject, pupil):
thepupil = get_object_or_404(Pupil, id=pupil, cohort__school=request.user.staff.school)
return display_pupil_info(request, subject, thepupil)

def display_pupil_info(request, subject, thepupil):
thesubject = get_object_or_404(Subject, shortname=subject)
# do lots more stuff here
return render_to_response('pupilpage.html', locals(), context_instance=RequestContext(request))

关于Django:限制对 View 的访问,取决于引用 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11635666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com