之前我们把API接口做好了,可以实现增删改查了
但是有一个问题
那就是这接口传过去的数据,谁都可以访问到
这并不安全也并不是我们想要的
比如说有些数据,我们可能只想让会员看到
于是,就需要对接口的访问对象进行认证:
在框架的底层其实已经实现了认证的代码
只不过在我们之前写的接口并没有调用,
上代码了:
class BookView(viewsets.ModelViewSet):
authentication_classes = [UserAuth]
queryset = Book.objects.all()
serializer_class = BookSerialize
先在接口视图中调用 authentication_classes = [UserAuth]
定义接口认证类UserAuth
随后手写接口认证类
class UserAuth():
def authenticate_header(self,request):
pass
def authenticate(self,request):
token = request.query_params.get('token')
try:
token = UserToken.objects.get(token=token)
return token.user,token.token
except Exception:
raise APIException('认证不通过')
authenticate方法就是完成我们认证逻辑的方法
虽然没有继承任何类
但是在底层调用的时候,从某种意义上讲
作用类似于重写认证方法
token就是用户验证的身份码
当验证不通过时
数据库模型:
class User(models.Model):
user_types = ((1,'NOMAL'),
(2,'SVIP'),
(3,'VVIP'))
username = models.CharField('用户名',max_length=22)
password = models.CharField('密码',max_length=32)
user_type = models.SmallIntegerField('用户级别',choices=user_types,default=1)
class UserToken(models.Model):
user = models.OneToOneField(User,related_name='user_token')
token = models.CharField('用户token',max_length=200)
当然,也不是一定非要用token作为验证
我们同样经常使用的cookie和session也可以作为判断的依据
当然,用APIView也可以实现,如果你觉得自己要求比较难以满足的话:
class Login(APIView):
def post(self,request):
fields = {'username','password'}
data_set = set(request.data.keys())
info = {}
if fields.issubset(data_set):
for k in fields:
info[k] = request.data[k]
user_instance = User.objects.filter(**info).first()
response = {}
if user_instance:
#注意这里的defaults
token = UserToken.objects.update_or_create(user=user_instance,defaults={
'token':set_token()
})
response['token'] = token[0].token
else:
response['error'] = '错了错了'
return JsonResponse(response)
好了,就先写到这了