明确一点我们还是要使用@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修饰的函数里面已经完成了权限的控制,如果权限满足就继续往后面走,如果权限不满足就抛出异常。
通过上图可以看到有很多的重复的视图函数名放到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给返回回来。
我们把add方法定义在SuperScope里面合理么?岂不是只有SuperScope才支持这种相加的操作?
假如我们的AdminScope也要有这种相加的操作,所以我们不应该写到具体的方法中,而是定义一个基类。
下面我们定义如下基类
然后我们来测试一下AdminScope
然后我们发现打印了两次!
所以我们最后要去重的
我们要实现上图红框所示采用+号的形式,因为我们发现python内置的数据类型是可以使用+号的,例如我们把两个列表合并在一起可以使用+号。那么我们可不可以把我们自己定义的两个对象用+合并在一起呢?可以的!我们要使用到运算符重载
我们只需要把基类的add前后加两个下划线就行了。然后别的类换成+号就行啦
6、
批量导入模块下所有的视图函数
先看两种形式的slice定义// 定义未初始化的slicevar s1 []string// 通过字面量形式定义并初始化为空slicevar s2 = []string{}// 通过make函数定义并初始化为空slicevar s3 = make([]string, 0, 0)我们知道,在golang中切片是对底层数组中的连续一部分存储空间的引用,是类似一种数组指针的存在,例如我们可以直接像打印一个指针所指向的地址的形式来打印切片 // 先来看%p 打印格式的用法 var arr =
实现自定义Nlog输出目标到Mqtt,通过Web订阅日志,解决物联网场景下日志不及时的问题。
MainActivity如下:package cc.wy;import java.util.ArrayList;import android.app.Activity;import android.app.ActionBar.LayoutParams;import android.content.Context;import android.os.Bundle;import an
目录????前言思路类型一:数字实现效果代码实现类型二:元组实现效果代码实现????前言博主最近工作中刚好用到数据分箱操作(对相同数据进行遍历比较,避免了全部遍历比较,大大减少了电脑IO次数,提高程序运行速度),翻了很多博文都没有找到解决方法,写一下我自己的解决思路!!!思路先给定 last 为列表第一个(并存入temp列表),将后面的数据从第二个开始与 last 比较,如果相同存入 temp 中。当不相同时,则将 last 切换为 不同的那个数(并存入temp),并将 temp列表 放入
为什么80%的码农都做不了架构师?>>> ...
#include#include "test1.h"#include "test1.h" //多次包含也不会出错int test2(void);int main(void){ printf("main.c\n"); test1(); test2();}
在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性、接口的稳定性、接口的跨域性、接口的协议规则、接口的路径规则、接口单一原则、接口过滤和接口组合等诸多因素,本篇文章将简要分析这些因素。一 规范性建议1.职责原则在设计接口时,必须明确接口的职责,即接口类型,接口应解决什么业务问题等2.单一性原则在明确接口职责的条件下,尽量做到接口单一,即一个接口只做一...
进入PLSQL 工具栏TOOLS下的EXPORT TABLE选项,选择需要导出的表,左下角可以选择导出时是否带triggers触发器,该方法无法附带sequence导出。导入:imp 用户名/密码@数据库名 file=文件存储路径 fromuser=从哪个用户导出 touser=从哪个用户导入。导出前需要选择Export Executable执行文件,在Oracle安装文件里面的bin文件夹下找到exp.exe文件。导出:exp 用户名/密码@数据库名 file=文件存储路径 full=y。
github.com/eclipse/paho.mqtt.golang简明教程
转自:https://blog.csdn.net/ananhao/article/details/78938960软件体系结构——4+1视图(整理资料)架构视图是对于从某一视角或某一点上看到的系统所做的简化描述,描述中涵盖了系统的某一特定方面,而省略了于此方面无关的实体。架构视图如同在建筑学中的不同种类的蓝图。1. 背景软件架构文档过分强调软件开发的某一个方面。架构不能解决所...
Hyperledger Fabric 实战(1) fabric-sdk-node 关于Fabric SDK安装环境建node服务器invoke方法内容如下:query方法内容如下:注意关于Fabric SDK目前Fabric官方提供了四种语言版本的SDK,分别如下:1 Fabric Nodejs SDK2 Fabric Java SDK3 Fabric Go SDK4 Fabric P...
为什么80%的码农都做不了架构师?>>> ...