博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django Restframework.3
阅读量:5054 次
发布时间:2019-06-12

本文共 3293 字,大约阅读时间需要 10 分钟。

认证和权限

拿注册登陆来说,现在想实现的功能是:只有登陆的用户才能查看动物列表,没登陆的用户没有权限

  • 在项目文件中创建authentication.py的文件
from django.core.cache import cachefrom rest_framework.authentication import BaseAuthenticationfrom App.models import Userclass UserTokenAuthentication(BaseAuthentication): #继承自BaseAuthentication    def authenticate(self, request):        try:            token = request.query_params.get("token")            user_id = cache.get(token)            user = User.objects.get(pk=user_id)            return user, token    #将user和token存到request中        except Exception as e:            print(e)
  • 在对应的视图函数中添加认证
class AnimalsAPIView(ListCreateAPIView):    queryset = Animal.objects.all()    serializer_class = AnimalSerializer    authentication_classes = UserTokenAuthentication,  #要加逗号,元组形式
  • 此时还并不可以实现功能,需要添加权限
  • 在项目文件中创建permission.py的文件
from rest_framework.permissions import BasePermissionfrom App.models import Userclass LoginPermission(BasePermission):   #继承自BasePermission    def has_permission(self, request, view):        return isinstance(request.user, User)  #判断存储在request中的user是不是User的实例,如果是则返回True,有权限,反之没有权限
  • 如果想要实现哪个用户创建的动物就归属于哪个用户,则需要更该模型
class Animal(models.Model):    a_name = models.CharField(max_length=16)    # related_name 指定关联字段名字    默认 模型_set   指定之后就是我们的 related_name的值    a_user = models.ForeignKey(User, related_name="u_animals")
  • 序列化
lass AnimalSerializer(serializers.ModelSerializer):    a_user = serializers.ReadOnlyField(source="a_user.u_name")    class Meta:        model = Animal        fields = ("id", "a_name", "a_user")class UserSerializer(serializers.ModelSerializer):    u_animals = AnimalSerializer(many=True, read_only=True)    class Meta:        model = User        fields = ("id", "u_name", "u_password", "u_animals")
    • 当在视图类中调用create方法时,源代码是这样:
class CreateModelMixin(object):    """    Create a model instance.    """    def create(self, request, *args, **kwargs):        serializer = self.get_serializer(data=request.data)        serializer.is_valid(raise_exception=True)        self.perform_create(serializer)        headers = self.get_success_headers(serializer.data)        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)    def perform_create(self, serializer):        serializer.save()    def get_success_headers(self, data):        try:            return {
'Location': str(data[api_settings.URL_FIELD_NAME])} except (TypeError, KeyError): return {}
      • 在执行保存的时候分发出来了一个perform_create函数,所以要重写这个函数
  • class AnimalsAPIView(ListCreateAPIView):    queryset = Animal.objects.all()    serializer_class = AnimalSerializer    authentication_classes = UserTokenAuthentication,    permission_classes = LoginPermission,    def perform_create(self, serializer):        serializer.save(a_user=self.request.user)

    这样在存储的时候a_user字段就会自动对应上request中存储的user的信息,即所登陆的用户

  • 如果只允许当前用户可以查看修改删除,仍然需要添加权限
  • class LoginPermission(BasePermission):    def has_permission(self, request, view):        return isinstance(request.user, User)    def has_object_permission(self, request, view, obj):        return request.user.u_animals.filter(pk=obj.id).exists()  #返回True或False

    obj.id为路由中的参数,/animals/1/ 即obj.id=1 

  • 路由形式为:

  • urlpatterns = [    url(r'^animals/(?P
    \d+)/', views.AnimalAPIView.as_view()),]

     

转载于:https://www.cnblogs.com/zbcdamao/p/10990884.html

你可能感兴趣的文章
github使用说明
查看>>
oracle日常函数汇总(转载)
查看>>
Oracle OEM 配置报错: No value was set for the parameter DBCONTROL_HTTP_PORT 解决方法
查看>>
Oracle 11.2.0.1 升级到 11.2.0.3 示例
查看>>
Git常规操作
查看>>
IdentityServer4揭秘---Consent(同意页面)
查看>>
postgresql Linux安装
查看>>
01入门
查看>>
python正则表达式
查看>>
嵌套循环连接(nested loops join)原理
查看>>
shell统计特征数量
查看>>
复习文件操作
查看>>
git使用 ——转
查看>>
C#Hashtable与Dictionary性能
查看>>
10个让你忘记 Flash 的 HTML5 应用演示
查看>>
8个Python面试必考的题目,小编也被坑过 ToT
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
centos 图形界面和命令行界面切换(转载)
查看>>
Maven启用代理访问
查看>>
Primary definition
查看>>