0%

写一个资源共享服务 01.目标和必要的说明

写一个资源共享服务 - 01.我们的目标和一些必要的说明

需要解决的问题

我们总是有一些在电脑和手机之间共享某些资源的需求, 一段文本或者一个文件。

当然现有的工具也能很好的完成我们的需求, 比如最简单方便的qq微信, 或者其他更专业强大的工具软件和类库框架等。

但是作为爱折腾的我们肯定希望用上自己亲手实现的工具, 而且我们在自己的一亩三分地上想怎么玩就怎么玩, 不会受到任何限制。

事情刚开始的时候我们可以降低我们的需求, 这里不考虑安全问题, 没有身份验证; 对用户输入无任何额外的处理,

如果你打算让其他人也使用你的共享服务, 那么我们要处理的问题就比较多了, 比如最基本的安全问题, 需要一个用户账号系统; 需要防范潜在的恶意破坏。 还要一个用户共享权限, 比如一个文件除了他的所有者; 还有哪些用户有何种程度的权限。

关于这些我们暂时不考虑, 只要解决核心需求就可以了。

我们实现命令行界面; Windows图形用户界面和web界面, 手机客户端暂不考虑, 到目前为止本人完全不会折腾手机程序, 哈哈哈, 如果哪位童鞋有时间欢迎编写手机客户端的实现部分。

后台服务用python的flask框架; 数据存储用sqlite3; GUI部分用wxpython; web部分那肯定是html+js了!

所以大家还需要一定的python和js的基础。

关于数据存储

其实数据存储有其他更加丰富的方案, 像mysql; 或者mongoDB这些相对主流的解决方案都可以随意选用, 但是我喜欢sqlite3的超级简单, 当然如果你觉得sqlite3过于简陋可以选择其他任何数据存储方案。

文章给我们一个参照, 具体实现完全可以从自身实际出发; 按照自己喜好行驶!

后台提供一个通用的数据存储接口, 完全不关心数据存储的具体来源, 可以是mysql; 可以是mongoDB; 也可以是文件系统, 这样我们的后台可以任意改变数据存储方案了。

总而言之, 我们的共享服务实现一个分而治之的目的, 牵一发而动全身的结果是我们锁不希望看到的。

定义资源模型

我们的模型特别简单, 一个资源有如下几个字段:

  • id 自动产生 唯一标记资源

  • description 不可留空, 一个简短的描述, 比如, 某人的联系方式; 某个网站的URL, 某个文件的名称等等

  • content 不可留空, 具体内容, 通常是一段二进制数据,

  • type 不可留空, 资源类型, 文件或者文本

  • invalid 1有效, 0无效, 通常来说把用户删除的内容标记为0, 这些被标记为0的资源需要在合适的时候清理,

  • datetime 一个int64类型的整数记录资源的时间戳

    定义好了资源的模型后剩下的就是对这些资源的存取; 展示和传递了。

创建项目

我们这次用poetry来管理我们的项目, 在一个合适的位置输入如下命令创建一个poetry项目:

D:\Src\python>poetry new reshub
Created package reshub in reshub

D:\Src\python>

我们的服务就叫资源枢纽吧, 英文名称叫reshub, resource hub!

而后我们打开编辑pyproject.toml文件, 如下是我这边的配置, 大家根据需要修改就可以了:

[tool.poetry]
name = "reshub"
version = "0.1.0"
description = "在多设备之间共享资源的服务及其应用程序"
authors = ["freeRUOK <2651688427@qq.com>"]

[tool.poetry.dependencies]
python = "^3.10"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[[tool.poetry.source]]
name = "aliyun"
url = "http://mirrors.aliyun.com/pypi/simple"
default = true

这里你可以按照自己的喜好来修改name; description; version和authors , 需要注意的是name最好用英文; version使用语义化版本, authors从你的git配置里获取你的用户名和邮箱地址。

tool.poetry.source是后来加进去的, 是当前项目的依赖项网络元。

其余的文件夹和文件可以随意处理, 删除也行, 改名做其他用途也可以。

到此为止我们的项目已经创建好了, 接下来就是编码实现了。

首先激活我们的poetry虚拟环境:

D:\Src\python>cd reshub

D:\Src\python\reshub>poetry shell
Creating virtualenv reshub-nfLKpGrl-py3.10 in D:\cache\poetry-cache\virtualenvs
Spawning shell within D:\cache\poetry-cache\virtualenvs\reshub-nfLKpGrl-py3.10
Microsoft Windows [版本 10.0.19044.2130]
(c) Microsoft Corporation。保留所有权利。

D:\Src\python\reshub>

输出也许和我这边不太一样, 只要不报错就说明已经进入了虚拟环境, 接下来我们所有工作都在这个虚拟环境下进行, 为了不混淆, 建议暂时删除全局的flask; wxpython; requests这些模块。

当然如果你始终确定永远在虚拟环境下工作, 也完全可以保留全局任何模块。

总之虚拟环境的提示符和Windows命令提示符相同是一个不小的隐患!

反正我从poetry帮助里既没看到如何检测当前虚拟环境是否激活, 也没看到poetry虚拟环境提示符配置项, 或者调试的时候干脆不用激活虚拟环境了, 直接用poetry run。

总之调试的时候需要格外注意你的项目在什么环境下运行, 是全局环境或者当前项目的虚拟环境。

行了, 这次到此为止做个总结。

总结

第一篇我们明确了需求, 定义了资源模型, 创建了项目。

额外注意调试程序的时候留意项目运行在何种环境, 确保项目始终运行在当前虚拟环境下。

下次我们解决数据存取问题, 未完待续……