ConfigByLmdb
ConfigByLmdb 是一个基于 lmdb 1.5.1 版本 自定义封装的库,主要用于快速动态读写大量配置信息的数据库工具。
概述
lmdb是一个轻量级、本地部署的高性能数据库,ConfigByLmdb 仅对其进行了某些场景简单的接口封装。
安装
使用 pip 安装 ConfigByLmdb :
pip install ConfigByLmdb
也可以使用 uv 安装或加入项目依赖:
uv pip install ConfigByLmdb # 安装到当前环境
uv add ConfigByLmdb # 加入 pyproject.toml 依赖
本项目遵循 PEP 517 / PEP 621,wheel 为 py3-none-any ,并已包含完整的 web 界面静态资源, 因此从 wheel 或 sdist 安装(含 uv 的构建隔离)都能直接使用 web 功能。
请注意,由于本项目是 lmdb 的自定义封装版本,可能需要从源代码安装或使用特定的安装步骤。
使用示例
以下是一个简单的使用示例,展示如何使用:
from ConfigByLmdb import DB,Structure
db = DB()
db_name = 'db'
name_db = 'test'
# 创建或初始化数据库
print(db.init_db(db_name))
# 创建命名数据库
# data = Structure("主键名",[('a',str),('b',str),('c',dict),('d',int),("e",float)]) # 设置数据库结构
# print(db.create_name_db(db_name,name_db,"这是一个测试命名数据库",data))
# 添加
# print(db.write(db_name,name_db,'t1',{'a':"你好",'b':"123",'c':{"f":1,"g":'abc'},"d":189,"e":0.123}))
# print(db.write(db_name,name_db,'t2',{'a':"hello!",'b':"234",'c':{"f":3,"g":'ret'},"d":49,"e":15.48}))
# print(db.write(db_name,name_db,'t3',{'a':"A和B",'b':"858",'c':{"f":3,"g":'ret'},"d":49,"e":15.48}))
# print(db.write(db_name,name_db,json.dumps({'a':"A和B",'b':858}),{'a':"A和B",'b':858}))
# 错误示范(数据格式不对应)
# l = []
# for i in range(10):
# l.append({'body'+str(i):{'a':"你好",'b':"318",'c':None,"d":4945,"e":185.48}})
# print(db.batch_write(db_name,name_db,l))
# 正确示范
# l = []
# import random
# for i in range(1000):
# l.append({'body'+str(i):"a"+str(i * random.randint(1, 100))})
# print(db.batch_write(db_name,name_db,l))
# print(db.get_sum(db_name,name_db))
# 查询
# print(db.read(db_name,name_db,'body2'))
# print(db.get(db_name,name_db,['body4','c','f']))
# print(db.get_limit(db_name,name_db,0,100))
# 匹配查询
# print(db.matching(db_name,name_db,"body1",0,10),len(db.matching(db_name,name_db,"body1",0,10)[0]))
# print(db.matching(db_name,name_db,"修改后的值",0,10),len(db.matching(db_name,name_db,"修改后的值",0,10)[0]))
# print(db.matching(db_name,name_db,45,matching_level=-2))
# print(db.precise_matching(db_name,name_db,str({'a':"A和B",'b':858}),matching_level=-2))
# print(db.precise_matching(db_name,name_db,json.dumps({'a':"A和B",'b':858}),matching_level=0))
# 删除
# print(db.read(db_name,name_db,'body5'))
# print(db.remove(db_name,name_db,['body5','c','f']))
# print(db.read(db_name,name_db,'body5'))
# print(db.delete(db_name,name_db,json.dumps({'a':"A和B",'b':858})))
# print(db.read(db_name,name_db,json.dumps({'a':"A和B",'b':858})))
# 修改
# print(db.read(db_name,name_db,'body3'))
# print(db.updata(db_name,name_db,"body3",{'a':"修改后的值",'b':"315",'c':{"t":1},"d":911,"e":1.48}))
# print(db.read(db_name,name_db,'body3'))
# print(db.read(db_name,name_db,'body6'))
# print(db.set(db_name,name_db,['body6','a'],"修改后的值"))
# print(db.read(db_name,name_db,'body6'))
# 数据库信息
# print(db.get_sum(db_name,name_db))
# print(db.get_name_database_list(db_name)) # 指定数据库下命名数据库列表
# print(db.get_db_name_list()) # 所有数据库列表
# print(db.get_db_info(db_name)) # 数据库配置信息
# 数据库操作
# print(db.drop_name_db(db_name,name_db)) # 删除指定命名数据库
# print(db.get_name_database_list(db_name))
# print(db.env_close(db_name)) # 关闭指定数据库
# print(db.cleanup(db_name)) # 删除指定数据库
# print(db.get_db_name_list())
########################################################
# web访问
from ConfigByLmdb.web import run
run()
# 打开浏览器访问
# http://127.0.0.1:8080/
Web 认证(可选)
web 服务默认**不需要登录**;只有配置了凭据才会启用认证,未配置时行为与旧版本完全一致。 支持两种形式,可单独使用也可同时启用:
authenticator 动态口令**(TOTP,RFC 6238)——默认 ``period=180`` ,即验证码 **3 分钟变化一次;
账户 + 密钥——静态密钥,支持明文或 pbkdf2_sha256 哈希存储。
认证凭据的解析顺序为:run(auth=...) 参数 > 环境变量 > config/web_auth.json 配置文件。
方式一:动态口令(authenticator)
先生成密钥并换取 otpauth 链接(用认证器 App 扫码或手动录入):
from ConfigByLmdb.web_auth import generate_secret, provisioning_uri
secret = generate_secret() # 随机 Base32 密钥
print(secret)
print(provisioning_uri(secret, account="admin", period=180))
然后启动服务:
from ConfigByLmdb.web import run
run(auth={
"totp": {"secret": secret, "period": 180, "window": 1},
"account": "admin",
})
# 打开 http://127.0.0.1:8080/ ,输入 App 上显示的动态口令
方式二:账户 + 密钥
from ConfigByLmdb.web import run
from ConfigByLmdb.web_auth import hash_key
run(auth={
# 建议存哈希而不是明文
"keys": {"admin": hash_key("your-static-key")},
"session": {"secret": "please-change-me", "seconds": 3600},
})
keys 支持三种写法:{"admin": "key"} 、[{"account": "admin", "key": "key"}] 、 "admin:key,user2:key2" 。
同时启用两种形式
run(auth={
"methods": ["totp", "key"],
"totp": {"secret": secret, "period": 180},
"keys": {"admin": hash_key("your-static-key")},
"require_both": False, # True = 必须同时通过两种验证(真正的双因素)
})
配置文件方式
在项目目录下创建 config/web_auth.json (该文件不会被发布到 PyPI):
{
"enabled": true,
"methods": ["totp", "key"],
"require_both": false,
"issuer": "ConfigByLmdb",
"account": "admin",
"totp": {"secret": "你的BASE32密钥", "period": 180, "digits": 6, "window": 1},
"key": {"account": "admin", "key": "你的静态密钥或pbkdf2哈希"},
"session": {"secret": "会话签名密钥", "seconds": 3600, "secure": false}
}
环境变量方式
set CONFIGBYLMDB_WEB_TOTP_SECRET=你的BASE32密钥
set CONFIGBYLMDB_WEB_TOTP_PERIOD=180
set CONFIGBYLMDB_WEB_ACCOUNT=admin
set CONFIGBYLMDB_WEB_KEY=你的静态密钥
set CONFIGBYLMDB_WEB_SESSION_SECRET=会话签名密钥
Linux/macOS 用 export 代替 set 。常用变量还有 CONFIGBYLMDB_WEB_METHODS 、CONFIGBYLMDB_WEB_WINDOW 、CONFIGBYLMDB_WEB_KEYS 、 CONFIGBYLMDB_WEB_SESSION_SECONDS 、CONFIGBYLMDB_WEB_ENABLED (设为 0 可强制关闭)。
自行托管 uvicorn 时
uvicorn ConfigByLmdb.web:app --port 8080
此时不会经过 run() ,但导入时会按「环境变量 > config/web_auth.json 」自动启用认证; 也可以在代码里先调用 ConfigByLmdb.web.configure_auth({...}) 再启动。
认证相关接口
接口 |
说明 |
|---|---|
GET /login |
登录页(后端渲染,包含两种认证形式的表单) |
POST /auth/login |
登录,成功后下发会话 Cookie 并返回 token |
POST /auth/logout |
登出(服务端吊销令牌并清除 Cookie) |
GET|POST /auth/status |
查询认证状态(无需登录,不返回任何密钥) |
登录成功后除浏览器 Cookie 外,也可以把返回的 token 作为接口凭据:
curl -X POST http://127.0.0.1:8080/auth/login ^
-H "Content-Type: application/json" ^
-d "{\"method\": \"key\", \"account\": \"admin\", \"key\": \"your-static-key\"}"
# 返回 {"result":true, "token":"...", ...}
curl -X POST http://127.0.0.1:8080/get_db_name_list ^
-H "Authorization: Bearer 上一步的token"
安全说明
未启用认证时,web 服务对能访问该端口的所有人开放,请勿直接暴露到公网;
多进程/多副本部署请显式配置 session.secret (否则每个进程各自随机生成, 会话无法互通且重启即失效);
登出采用「令牌吊销表」,只对当前进程生效;需要跨进程即时失效请更换 session.secret ;
连续登录失败达到 max_failures (默认 10 次 / 300 秒)会临时返回 429 ;
动态口令默认开启防重放,同一验证码只能用一次。
贡献
我们欢迎任何形式的贡献,包括但不限于:
报告问题或错误。
提供功能请求或改进建议。
测试
测试代码只保留在源码仓库中,不会随发行包发布。从源码检出后运行:
pip install -e ".[test]"
python -m pytest ConfigByLmdb/Test/test_web_auth.py -v
许可证
本项目采用 OLDAP-2.8 许可证。有关更多信息,请查看 LICENSE 文件。
Metadata
Release files for ConfigByLmdb 0.0.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| configbylmdb-0.0.11.tar.gz | 688.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| configbylmdb-0.0.11-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.4 MB
Release files / configbylmdb-0.0.11.tar.gz
| Download URL | configbylmdb-0.0.11.tar.gz |
|---|---|
| Size | 688.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6efcb644885ce4c10c66a43c6e5777ce10cfc28bb374d3f03f386101fef1c008
|
|
BLAKE2b-256 checksum How to use checksums |
abba7169d0e851588b3315683ce88c478343ec594df5994c2ef90b69432d81a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.10.14
|
Release files / configbylmdb-0.0.11-py3-none-any.whl
| Download URL | configbylmdb-0.0.11-py3-none-any.whl |
|---|---|
| Size | 691.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9fc101411b51fece698b47b5e8adcdd9b7c3d5e7fd5c2243240a15860f5d2012
|
|
BLAKE2b-256 checksum How to use checksums |
80829261d9b00aee0efdade8b92ae2065e22649ea9dd30ed2f4fb7338b9e8cee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.10.14
|