Python Django——允许用户只查看自己的页面
我正在构建的Django应用程序的开发即将结束。此应用程序中的关键视图是一个显示某种度量的用户仪表板。基本上,我不希望用户能够看到其他用户的仪表盘。现在我的观点是这样的:Python Django——允许用户只查看自己的页面,python,django,django-views,django-urls,Python,Django,Django Views,Django Urls,我正在构建的Django应用程序的开发即将结束。此应用程序中的关键视图是一个显示某种度量的用户仪表板。基本上,我不希望用户能够看到其他用户的仪表盘。现在我的观点是这样的: @login_required @permission_required('social_followup.add_list') def user_dashboard(request, list_id): try: user_list = models.List.objects.get(pk=list_
@login_required
@permission_required('social_followup.add_list')
def user_dashboard(request, list_id):
try:
user_list = models.List.objects.get(pk=list_id)
except models.List.DoesNotExist:
raise Http404
return TemplateResponse(request, 'dashboard/view.html', {'user_list': user_list})
url(r'u/dashboard/(?P<list_id>\d+)/$', views.user_dashboard, name='user_dashboard'),
try:
user_list = models.List.objects.get(pk=list_id, owner=request.user)
except models.List.DoesNotExist:
raise Http404
此视图的url如下所示:
@login_required
@permission_required('social_followup.add_list')
def user_dashboard(request, list_id):
try:
user_list = models.List.objects.get(pk=list_id)
except models.List.DoesNotExist:
raise Http404
return TemplateResponse(request, 'dashboard/view.html', {'user_list': user_list})
url(r'u/dashboard/(?P<list_id>\d+)/$', views.user_dashboard, name='user_dashboard'),
try:
user_list = models.List.objects.get(pk=list_id, owner=request.user)
except models.List.DoesNotExist:
raise Http404
url(r'u/dashboard/(?P\d+/$),views.user\u dashboard,name='user\u dashboard'),
现在,任何登录用户都可以更改URL中的
列表\u id
,并访问不同的仪表板。如何使用户只查看自己列表id的仪表板,而不从URL中删除列表id
参数?我对Django的这一部分很陌生,不知道该往哪个方向走。只要拉一下请求。用户
并确保这个列表是他们的
您尚未描述您的模型,但它应该是直截了当的
也许您的列表模型中存储了一个用户ID?那么,
if not request.user == user_list.user:
response = http.HttpResponse()
response.status_code = 403
return response
您需要存储一些关于用户可以访问哪些列表的信息,然后将这些信息包括在用户列表查找中。让我们假设一个简单的情况,
List
有一个所有者,User
模型有一个外键。这是列表和用户之间的多对一关系;没有列表由多个用户拥有,但一个用户可以有多个列表。然后你想要这样的东西:
@login_required
@permission_required('social_followup.add_list')
def user_dashboard(request, list_id):
try:
user_list = models.List.objects.get(pk=list_id)
except models.List.DoesNotExist:
raise Http404
return TemplateResponse(request, 'dashboard/view.html', {'user_list': user_list})
url(r'u/dashboard/(?P<list_id>\d+)/$', views.user_dashboard, name='user_dashboard'),
try:
user_list = models.List.objects.get(pk=list_id, owner=request.user)
except models.List.DoesNotExist:
raise Http404
返回404还是403在某种程度上是一个意见问题;403的定义是:
如果请求方法不是HEAD,并且服务器希望公开请求未得到满足的原因,那么它应该在实体中描述拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)
如果您返回404,您可以使用django快捷方式函数而不是显式的try/except-显式地执行它没有什么错,但是这种需求非常普遍,有一个方便的函数来执行它。我使用可重用的mixin解决类似的情况。您可以通过dispatch方法的方法装饰器或视图的urlpatterns添加所需的登录名
class OwnershipMixin(object):
"""
Mixin providing a dispatch overload that checks object ownership. is_staff and is_supervisor
are considered object owners as well. This mixin must be loaded before any class based views
are loaded for example class SomeView(OwnershipMixin, ListView)
"""
def dispatch(self, request, *args, **kwargs):
self.request = request
self.args = args
self.kwargs = kwargs
# we need to manually "wake up" self.request.user which is still a SimpleLazyObject at this point
# and manually obtain this object's owner information.
current_user = self.request.user._wrapped if hasattr(self.request.user, '_wrapped') else self.request.user
object_owner = getattr(self.get_object(), 'author')
if current_user != object_owner and not current_user.is_superuser and not current_user.is_staff:
raise PermissionDenied
return super(OwnershipMixin, self).dispatch(request, *args, **kwargs)
什么是
列表\u id
?是某个用户的字段吗?我有一个列表和用户的联接表(愚蠢的遗留数据库)。不过,我想我有办法适应这种方法,谢谢@ChrisClouten,啊,是的,然后你会做适当的查询。这是“检查用户是否有权限”的伪代码。这起作用了。我只是记得我在另一个视图上做了类似的事情,但我就是想不出如何用跛脚的连接表来写这个。谢谢你的帮助!我最终使用了raisepermissiondenied