在检查用户的自定义属性以允许访问视图时,我遇到了问题。
让我们假设我只想允许访问在其userprofile中激活了self_store选项的用户。
当我使用函数视图非常容易时,我把它放在视图的开头并且工作正常
display_errors=1
memory_limit=128M
max_execution_time=90
max_input_vars=3500
upload_max_filesize=64M
post_max_size=64M
allow_url_fopen=0
就像我说的那样非常容易使用,并且在我的userprofile中为不同的选项做了不同的事情
但我无法找到在基于类的视图中执行此操作的方法,如果我想允许访问已在usersprofile中激活self_store选项的用户,我该怎么做?例如在此updateview中
if not request.user.is_authenticated():
return redirect('auth_login')
if not request.user.userprofile.self_store:
return do_something_here
我可以使用logginrequired mixin完美但我想像我说的那样在userprofile中使用自定义用户属性。
我需要进行的检查类似于PermissionRequired Mixin,但是对于userprofile中的属性。
答案 0 :(得分:2)
在CBV中,您可以作为 self.request 访问请求。因此,您可以轻松地将您的个人资料属性检查为self.request.user.profile.attribute
。 CBV中还有一个dispatch(request, *args, **kwargs)
方法(见说明)
视图的视图部分 - 接受请求参数和参数的方法,并返回HTTP响应。 默认实现将检查HTTP方法并尝试委托给与HTTP方法匹配的方法; GET将被委托给get(),POST到post(),等等。
在我看来,您可以在调度方法中验证您的用户权限。例如,您可以按配置文件属性验证用户:
def dispatch(self, request, *args, **kwargs):
"""Return 403 if flag is not set in a user profile. """
if not request.user.profile.has_flag:
return HttpResponseForbidden()
return super().dispatch(request, *args, **kwargs)
或通过用户权限:
def dispatch(self, request, *args, **kwargs):
"""Return 403 if user does not have specific permission. """
if not request.user.has_perm('client_permission.client_edit'):
return HttpResponseForbidden()
return super().dispatch(request, *args, **kwargs)
如果您想要验证请求用户而不是客户端本身,您可以在获取对象时检查客户端权限:
from django.core.exceptions import PermissionDenied
def get_object(self, *args, **kwargs):
client = super().get_object(*args, **kwargs)
if not client.profile.has_flag:
# The PermissionDenied exception is raised
# when a user does not have permission
# to perform the action requested.
raise PermissionDenied
return client
您可以在此处详细了解调度方法:https://docs.djangoproject.com/en/1.11/ref/class-based-views/base/#django.views.generic.base.View.dispatch
我还要注意,如果您有使用Django Rest Framework检查任何权限的任务,您可以使用permission_classes(请参阅http://www.django-rest-framework.org/api-guide/permissions/)。您应该做的就是定义自己的权限类:
from rest_framework.permissions import BasePermission
class UserHasFlag(BasePermission):
"""Check that user has a flag set in a profile. """
def has_permission(self, request, view):
return request.user.profile.has_flag
您的观点将如下所示:
from rest_framework.permissions import IsAuthenticated
class ClientUpdateView(UpdateView):
permission_classes = (IsAuthenticated, UserHasFlag)
model = Client
template_name = "clients/update.html"
pk_url_kwarg = 'client_id'
fields = [
'first_name',
'last_name',
'email',
'phone',
'phone_2',
'address',
]