drf 序列化 认证
序列化
对象,转成json格式
用drf的序列化组件
定义一个类继承class BookSerializer(serializers.Serializer):
-写字段,如果不指定source,字段名必须跟数据库字段名对应(source指定的值跟字段名不能重复)
-source还可以指定方法
-publish = serializers.SerializerMethodField()
def get_publish(self,obj):
obj.publish
-Serializer
-ModelSerializer
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())