目的: 为不同的试图 用不同的权限访问
只要写上一个类,权限类,然后在views中引入就可以了,套路和上面的权的是一样的模式
如下所以:
写的权限类:
has_permission()返回True表示权限认证成功,返回False表示权限不通过,这个函数同时有三个参数,最后一个是view, 这个是在源码中规定的
注意里面的message
#下面是权限的代码, 没有继承restframework类中的任何一个类
class MyPermission(object):
message = '这里可以定制返回的消息给前端显示。这个是类的做法,因为has_permission方法会有一个getattr(permission, "message", None),这里message就是自己定义的'
def has_permission(self, request, view): #这个函数返回True或者False,True表示有权限,False表示没有权限,这个函数同时有三个参数,最后一个是view, 这个是在源码中规定的
if request.user.user_type != 3:
return False
return True
写的试图:
class OrderView(APIView):
#这里就是权限类的列表。
permission_classes = [MyPermission,]
#需求: 只有svip用户才有权限看
def get(self, request, *args, **kwargs):
ret = {'code':1000, 'msg':None, 'data':None} #用于标实是不是请求成功 和数据
#标记用户登陆了才可以看到这里的数据,否则看不到数据
#这里就用上面说的token,,因为只有登陆了,才会生成token,才标实用户已经登陆了,否则没有token,就表示用户没有登陆
#这里的认证方法比较传统,没有用到restframework的认证类,如果有很多视图,则需要在每个视图中间都要写这个认证函数,
#我们可以自定义一个验证类,然后重写authenticate()方法,把验证登陆的语句写在里面,然后在这里是需要调用就可以了.一劳永逸
# token = request._request.GET.get('token')
# if not token:
# return HttpResponse('用户未登录,无法查看')
try:
ret['data'] = ORDER_DICT
except Exception as e:
pass
return JsonResponse(ret)
同理也可以写在配置文件中:
如下:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':['api.utils.auth.FirstAuthenticate',], #注意这个格式, 这里的DEFAULT_AUTHENTICATION_CLASSES是restframework 配置规定的, 后面的列表就是认证的类. 里面写的是认证类的路径
#下面两句是匿名用户的设置:
'UNAUTHENTICATED_USER':None, #匿名, 则request.user = None
'UNAUTHENTICATED_TOKEN':None, #匿名, 则request.token = None
'DEFAULT_PERMISSION_CLASSES':['api.utils.permission.MyPermission'] #权限类的全局设置
}
内置权限类 可以继承BasePermission
下面代码是继承BasePermission 之后的写法:
#下面是权限的代码, 没有继承restframework类中的任何一个类
class MyPermission(BasePermission):
message = '这里可以定制返回的消息给前端显示。这个是类的做法,因为has_permission方法会有一个getattr(permission, "message", None),这里message就是自己定义的'
def has_permission(self, request, view): #这个函数返回True或者False,True表示有权限,False表示没有权限,这个函数同时有三个参数,最后一个是view, 这个是在源码中规定的
if request.user.user_type != 3:
return False
return True