1、关于用户权限的几种情况举例:
2、解决思路:
明确一点我们还是要使用@auth.login_required和@auth.verify_password,因为这样可以把接口不公开暴露
我们可以把权限信息写入到token令牌中
我们可以把A、B、C、D看做是表,可以写到mysql、redis或者就写到我们的代码里。其实最好是把这种对应关系做成配置文件的形式。
那么,我们先给作用域起名字,超级管理员叫做SuperScpoe、管理员叫AdminScope、普通用户叫UserScope
首先在生产令牌的时候要写入权限作用域,然后携带访问的时候我们才可以把它的权限作用域读取出来,从而去具体的表里去执行查询操作。
我们在验证令牌的函数@auth.verify_password中拿到当前请求的request请求所访问的视图函数
当前请求要访问哪个视图函数,视图函数在我们的flask中是可以用endpoint来表示的。我们使用request.endpoint就可以拿到当前这个请求要访问的视图函数
我们先说一下401和403,401在http中代表的是授权失败,403代表的是禁止访问权限不够,这两个的意义是不同的,授权失败可能是账号密码不匹配,但是403是权限不够或者就是不让访问。
关键问题:
下图是我们单独编写的用来做用户权限控制的模块
我们以为scope是UserScope具体的一个对象,但是仅仅是一个名字,而且里面是字符串。
如何通过一个类的名字得到一个类的对象呢?我们现在涉及到一个动态创建对象的需求,scope()是不行的,在java里面叫反射,但是在反射这个名词在我们python里面不常用到。
python里面有一个函数叫做globals,它可以帮我们实现,我们先看一下globals的调用结果
可以看到首先是一个字典,里面有很多的内置变量作为键,我们最关注的就是AdminScop和UserScope
可以看到UserScope的键是一个字符串,值就是class UserScope
globals会把当前模块下所有的变量包括在这里面编写的各种各样的类都变成一个字典,所以看下图这么写就拿到一个对象了。
到此就结束了,因为我们在@auth.verify_password修饰的函数里面已经完成了权限的控制,如果权限满足就继续往后面走,如果权限不满足就抛出异常。
3、解决代码臃肿问题并实现链式连加操作
通过上图可以看到有很多的重复的视图函数名放到allow_api中,所以如果项目很大,这样很繁琐。
我们可以把UserScope的allow_api合并到SuperScope的allow_api中
现在就已经把UserScope的allow_api合并到SuperScope的allow_api里面了
如果我们在想合并UserScope呢就在加一个.add()????但是现在是不支持这种链式的add的
上图的写法会报错
因为我们第一次调用self.add之后我们add方法的内部没有返回任何的东西,所以说是self.add(UserScope())调用的结果是None。
None是没有后续的add操作的,所以我们只需要在add中把我们的self给返回回来。
4、add方法定义优化
我们把add方法定义在SuperScope里面合理么?岂不是只有SuperScope才支持这种相加的操作?
假如我们的AdminScope也要有这种相加的操作,所以我们不应该写到具体的方法中,而是定义一个基类。
下面我们定义如下基类
然后我们来测试一下AdminScope
然后我们发现打印了两次!
所以我们最后要去重的
5、变成+的形式--------运算符重载
我们要实现上图红框所示采用+号的形式,因为我们发现python内置的数据类型是可以使用+号的,例如我们把两个列表合并在一起可以使用+号。那么我们可不可以把我们自己定义的两个对象用+合并在一起呢?可以的!我们要使用到运算符重载
我们只需要把基类的add前后加两个下划线就行了。然后别的类换成+号就行啦
6、
批量导入模块下所有的视图函数