Sanic 实现简单的 API 接口签名认证
前言
API 为什么需要设计签名验证?为了有一定的数据抓取防御能力。
需要考虑的点:
请求参数是否已被篡改
请求来源是否合法
请求是否具有唯一性
原理
参数签名方式:它要求客户端按照约定好的算法生成签名字符串,作为请求的一部分像接口请求,服务端验算签名即可知是否合法。
客户端
1 | import requests |
服务端
1 | from sanic import Sanic |
API 为什么需要设计签名验证?为了有一定的数据抓取防御能力。
需要考虑的点:
请求参数是否已被篡改
请求来源是否合法
请求是否具有唯一性
参数签名方式:它要求客户端按照约定好的算法生成签名字符串,作为请求的一部分像接口请求,服务端验算签名即可知是否合法。
1 | import requests |
1 | from sanic import Sanic |
目前 Docker Hub
上普通用户已经不能自动构建了,于是想通过 Github Actions
来实现打包并推送到 Docker Hub
第一步先在项目下建一个 yml
文件,路径:.github/workflows/push2hub.yml
内容如下:
1 | name: Publish Docker image |
上面 Yaml
的功能是,在每一次推送到 Master
分支上的时候,就将项目推送到 Docker Hub
上的 jakehu
用户下的 scripts
仓库里的 latest Tag
上
第二步需要在 github
上设置 DOCKER_USERNAME
和 DOCKER_PASSWORD
两个变量
第三步只需要对 Master
分支进行推送即可,然后我们就能在 Actions
里面看到对应的流水线信息
在使用 Sanic
的过程中对 ORM
的选择可谓是痛苦的,用过官方推荐的 Tortoise ORM
,也用过 SQLAlchemy
比起使用 ORM
我更喜欢原生 SQL
,当我看见 databases
的时候我发现它满足了的我所有要求,支持异步驱动 aiomysql
,支持原生 SQL
写法,还封装进了 SQLAlchemy
,只要你想你也可以把 databases
当作 SQLAlchemy
使用
安装 databases
1 | pip install databases |
安装数据库驱动
1 | pip install aiomysql |
在安装 databases
的时候会自动的安装 SQLAlchemy
目前已经支持 1.4
版本
利用监听器去控制数据库的连接和断开,并将句柄放入到应用上下文中 app.ctx.db
1 | ./server.py |
最后看如何在函数中使用,利用应用上下文中的句柄进行操作,最后在利用_mapping
属性进行转换
1 | @app.get("/") |
关于如何将 sqlalchemy.engine.row.Row
转化为 dict
可以参考
希望能像 npm install
那样自动的将安装的包加入到 requirements.txt
文件中,但是同时又不希望把子依赖加入其中
虽然我们能通过 pip freeze > requirements.txt
将依赖导出,但是这样导出的依赖,会把包的其他子依赖也导出,导致重新安装的时候总是提示包的版本不对
通过 bash
的 alias
或者函数来解决,在.zshrc
中添加以下函数
1 | function pip-install { |
1 | pip-install sanic |
1 | cat requirements.txt |
从上面文件可以看出 requirements.txt
中并没有 sanic
的其他子依赖,至于 sanic
的其他子依赖会在安装 sanic
时自动安装就不用管它了
最后我们在其他地方使用项目的时候只需要安装 requirements.txt
中的包就行了
1 | pip install -r requirements.txt |
在 Mac
系统中,如果利用 Homebrew
安装 LuaRocks
,默认只会安装最新版本的 Lua
。鉴于 lapis
与 luajit
都只兼容 lua@5.1
版本,所以就需要自行安装 lua@5.1
。
第一步:利用 Homebrew
安装 luarocks
1 | brew install luarocks |
第二步:利用 Homebrew
安装 lua@5.1
1 | brew install lua@5.1 |
第三步:查看 lua@5.1
的安装目录
1 | brew info lua@5.1 |
第四步:利用参数 --lua-dir
以及 --lua-version
使用 5.1
版本,两个参数可以同时设置,也可以只设置一个
1 | luarocks --lua-dir=/usr/local/Cellar/lua@5.1/5.1.5_8 --lua-version=5.1 install lapis |
通过上面设置就能兼容不同版本的 Lua
安装 luaossl
时出现以下错误:
1 | Installing https://luarocks.org/luaossl-20200709-0.src.rock |
解决如下:
设置 OPENSSL_DIR
以及 CRYPTO_DIR
1 | luarocks --lua-version=5.1 OPENSSL_DIR=/usr/local/Cellar/openssl@1.1/1.1.1k/ CRYPTO_DIR=/usr/local/Cellar/openssl@1.1/1.1.1k/ install lapis |
配置 LUA_PATH
和 LUA_CPATH
以及 PATH
,在终端中输入
1 | luarocks --lua-version=5.1 path --bin |
取得 LUA_PATH
和 LUA_CPATH
写入到 ~/.zshrc
中
1 | export LUA_PATH='' |
最后再将.luarocks/bin
导入 PATH
1 | export PATH="$HOME/.luarocks/bin:$PATH" |
如果不做上面操作就会出现下面错误
1 | lua entry thread aborted: runtime error: content_by_lua(nginx.conf.compiled:22):2: module 'lapis' not found: |
Python
框架 Sanic
实现文件上传功能
判断允许上传的类型,同时利用 UUID
生成新的文件名存储到对应的文件夹中
1 | @app.route("/upload", methods=['POST']) |
可以利用 Postman
上传测试,需要注意的是 header
头中的 Content-Type:multipart/form-data;
必须设置
需要访问上传过后的文件,这就需要用到 Sanic
静态文件代理
1 | path = "/user/data/web/upload" # 这里注意path是绝对路径 |
最后访问路径为:
1 | https://www.域名.com/upload/uuid.png |
从用 Hexo
和 Next
开始都不知道换了多少次评论系统了,最开始的多说,后来的 Valine
,再后来的 Disqus
。换来换去最后还是决定用 utterances
吧
第一步只需要访问:https://github.com/apps/utterances
进行安装
第二步选择存放 issues
的项目,可以跟 Github pages
放在同一个项目
1 | utterances: |
最后只需要在主题配置文件中进行如上配置即可
在设计数据库的时候有一个 IP
字段,是用来存多个 IP
地址。于是设计成了 Json
类型,记一下如何在 Tortoise Orm
中使用 JSON_CONTAINS
1 | from tortoise import Model, fields |
1 | from tortoise.functions import Function |
1 | filter = {} |
其他的 Json
函数也可自行扩展,这里我们再扩展一种 Json
模糊查询,即:
1 | select * from table where json_extract(field, '$') LIKE '%value%' |
实现如下:
1 | class JsonExtract(Function): |
在 JSONField
类型字段中使用 encoder
更改 json.dumps()
参数 ensure_ascii=False
,实现也非常的简单
1 | import json |
锦城虽云乐,不如早还家
需求很简单,通过域名证书的私钥分析证书的 DNS
域名以及有效期
分析后决定用 pyOpenSSL
来实现,具体代码如下
1 | from OpenSSL import crypto |
通过 get_subject()
和 get_issuer()
获取证书的其他信息
1 | subject = cert.get_subject() |