use*_*875 5 django-rest-framework
这是我的观点:
class PostListByUsername(generics.ListAPIView):
serializer_class = PostSerializer
permission_classes = (IsAuthenticated, IsLikeOrOwnerDeleteOrReadOnly, IsFromSameLocation,)
def get_queryset(self):
username = self.kwargs['username']
user = User.objects.get(username=username)
return Post.objects.filter(owner__username=username).order_by('-createdAt')
Run Code Online (Sandbox Code Playgroud)
这是我的IsFromSameLocation许可:
class IsFromSameLocation(permissions.BasePermission):
"""
Permission.
Allow permissions to authenticated users from the same
location as the user.
"""
message = 'Not from the same location.'
def has_permission(self, request, view):
username = view.kwargs.get('username', None)
try:
userProfile = User.objects.get(username=username)
except:
return False
return request.user.userextended.location == userProfile.userextended.location
Run Code Online (Sandbox Code Playgroud)
话虽如此,在我的get_queryset()方法中,我这样做user = User.objects.get(username=username),但如果用户不存在,我想引发 404 错误。我知道get_queryset()应该返回一个查询集,所以我猜我不应该在该方法中引发 404。那么我到底应该在哪里检查用户是否存在呢?请注意,在我的许可下,我确实进行了尝试和例外来查看用户是否存在,但根据我的理解,权限应该只返回 True 或 False (不会引发 404 错误)。
实际上,您可以从权限引发异常,Django 将正确处理它。例如,您可以使用get_object_or_404()快捷功能来做到这一点:
def has_permission(self, request, view):
username = view.kwargs.get('username', None)
userProfile = get_object_or_404(User, username=username)
return request.user.userextended.location == userProfile.userextended.location
Run Code Online (Sandbox Code Playgroud)
事实上,虽然抛出异常的代码是在视图中执行的,但它将由 Django 处理,因此从视图、序列化器、权限、模型等方法中引发异常并不重要。
| 归档时间: |
|
| 查看次数: |
2850 次 |
| 最近记录: |