drf 序列化 认证

序列化

  对象,转成json格式

  用drf的序列化组件

    定义一个类继承class BookSerializer(serializers.Serializer):

      -写字段,如果不指定source,字段名必须跟数据库字段名对应(source指定的值跟字段名不能重复)

      -source还可以指定方法

      -publish = serializers.SerializerMethodField()

      def get_publish(self,obj):

        obj.publish

      -Serializer

    -ModelSerializer

扫描二维码关注公众号,回复: 5358041 查看本文章

      class Meta:

        #指定表模型

        model = models.Book

        #序列化所有字段

        fields = '__all__'

        # 只想序列化title和id这两字锻

        # fields = ['title','id']

        # exclude和fields 不要连用

        # exclude = ['title']

        depth = 1

  认证组件

    -比如要访问books/路径,必须登录之后才能访问

    -一旦登录成功,在响应结果中写一个随机字符串

      {

        status:100,

        msg:登录成功,

        token:safsdaagsd

      }

    -只要用了drf,post提交数据,就不需要csrf验证了

    -token可以放在redis中;不在服务端存

    -{name:lqz,id:1}

    -把{name:lqz,id:1} 当作token,发到客户端

    -asdfasdf|{name:lqz,id:1} 当作token,发到客户端

    -以后客户端再发请求,会携带dafasdag|{name:lqz,id:1}过来

    -服务端截取{name:lqz,id:1}.再用我的加密方式加密:adsfags

    -假设它模拟成fsdagasg和请求的sadfasdg比较,如果一样就是登陆成功

    -token好处是,服务端不需要存session了

    -认证功能

      1.写一个类,继承BaseAuthentication

      2.def authenticate(self,request),记住传request对象

        -如果验证通过,返回None或者两个值

      3.在视图类中使用:(不要加括号)

        authentication_classes=[AuthLogin]

    -认证功能的局部配置

      -authentication_classes = [AuthLogin]

    -认证功能的全局配置,在settings.py中配置

      -REST_FRAMWORK = {

          "DEFAULT_AUTHENTICATION_CLASSES":["app01.auth.AuthLogin",]

        }

    -全局使用的局部禁用:

      authentication_classes=[]

    -drf内置了一些认证类(了解):

      -TokenAuthentication

      -SessionAuthentication

    -BaseAuthentication(规范了接口,模拟其他语言接口的概念)

      -def authenticate(self,request):

        raise NotlmplementedErroe(".authenticate() must be overridden.")

      如果写了一个类,继承BaseAuthentication,但是没有重写authenticate,就会抛异常

    -importlib

    -choice的用法

      # 0 是超级用户,1是普通用户,2是2b用户

        user_choice = ((0,'超级用户'),(1,'普通用户'),(2,'2b用户'))

        user_type = models.IntegerField(default=0,choices = user_choice)

        -取文字:

          print(user.get_user_type_display())

    

猜你喜欢

转载自www.cnblogs.com/xiaocaiyang/p/10451642.html