之前我们把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):
def authenticate(self,request):
token = request.query_params.get('token')
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)
好了,就先写到这了
之前我们把API接口做好了,可以实现增删改查了但是有一个问题那就是这接口传过去的数据,谁都可以访问到这并不安全也并不是我们想要的比如说有些数据,我们可能只想让会员看到于是,就需要对接口的访问对象进行认证:在框架的底层其实已经实现了认证的代码只不过在我们之前写的接口并没有调用,上代码了:class BookView(viewsets.ModelViewSet): authe...
pip install drfapikey
将“ rest_framework_api_key”添加到您的INSTALLED_APPS设置中:
INSTALLED_APPS = (
'rest_framework_api_key',
最后,在django设置下设置djang
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
@api_view
上篇文章我们讲到了接口认证,但是还没有讲完,现在我们继续完善这方面的知识
上篇文章所做的接口认证,是针对单个接口进行的
如果要做我们所有的接口都需要进行接口认证呢?
于是乎,我们可以实现一个全局的接口认证,并且非常容易
就是在settings中做一下配置就行了
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':(
'AP...
fastdfs上传报错ERROR - file: connection_pool.c, line: 130, connect to 118.24.81.106:23000 fail