# py2.7-client **Repository Path**: wsq6035266/py2.7-client ## Basic Information - **Project Name**: py2.7-client - **Description**: 客户端调用脚本 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: v2 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-10-22 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # py2.7-client *客户端调用脚本* 服务器地址:10.103.101.56 * 下载端口:8001 * 上传端口:8002 * 命令端口:8003 # 关系表说明 *Create by WSQ --2017-11-04* ## 字段说明 ### User 用户表 * `id` **主键**: 唯一标识字段/Int. * `name` **名称**: String(*20*) 唯一/非空 * `password` **用户密码**: String(*128*)/非空. * `is_admin` **用户权限**: Boolean/默认*False*/非空. * `info` **用户描述**: String(*50*) * `dir_id`**对应文件夹**: Int/外键/非空/OneToMany/CASCADE: 如果User的dir_id是唯一的,删除User记录会删除此条Dir记录.删除Dir记录会删除此记录下所有User记录. ### Set 数据集表 * `id` **主键**: 唯一标识字段/Int. * `name` **名称**: String(*20*) 唯一/非空. * `info` **集合描述**: String(*50*) * `user_id` **对应用户**: Int/外键/非空/OneToMany/CASCADE: 删除Set记录无操作,删除User记录会删除此记录下所有Set记录. * `dir_id`**对应文件夹**: Int/外键/非空/OneToMany/CASCADE: 如果Set的dir_id是唯一的,删除Set记录会删除此条Dir记录.删除Dir记录会删除此记录下所有Set记录. ### Per 集合与用户权限表 1. 除集合拥有者外,所有集合默认对其他用户不可见. 2. 在此表内的用户都具有对集合的可读权限. * `id` **主键**: 唯一标识字段/Int. * `user_id` **对应用户**: Int/外键/非空/ManyToMany/CASCADE: 删除User记录会删除此记录下所有与user_id关联的记录. * `set_id` **对应集合**: Int/外键/非空/ManyToMany/CASCADE: 删除Set记录会删除此记录下所有与set_id关联的记录. * `write` **是否可写**:Boolean/True表示可写,False表示只读. ### Dir 根目录文件夹表 此表仅与表达用户数据集的根目录 * `id` **主键**: 唯一标识字段/Int. * `name` **名称**: String(*20*) 唯一/非空. * `parent_id` **对应上级目录**: Int/表内外键/空表示此目录为根目录/数据库初始化时将自动在表内新建一条表示根目录的记录. ## 方法说明: ### 接受json格式: ```python { "command":"xxx" "argv":{ "xxx":"xxx" } } ``` * `command` 函数名 * `argv` 参数,无参数函数不需要此字段 ### 对于所有返回的json文件,统一格式 ```python { "return":True or False, "info":"xxx" } ``` ### 接口列表 * **用户**: ```python # 新增用户,自动在Dir表内新增记录,自动在服务器根目录内创建目录. def create_user(name,password,is_admin=False,info=None): # 删除用户,自动删除Dir表内关联记录,自动删除服务器关联目录. def delete_user(id): # 修改用户信息,必须带有id.可选字段:password,is_admin,info. def update_user(id and kwargs): # 全部用户 def all_users() # 登录 def login(name,password) ``` * **数据集**: ```python # 新增集合,自动在Dir表内新增记录,自动在服务器根目录内创建目录. def create_set(name, user_id, info) # 删除集合,自动删除Dir表内关联记录,自动删除服务器关联目录 def delete_set(id): # 全部集合 def all_sets() #单个集合 def get_set(id) ``` * **权限表** ```python # 新增/修改读写权限 def create_per(user_id, set_id, write=False) # 删除读写权限 def delete_per(user_id,set_id) ``` ### 接口返回值说明 三张表将以三元嵌套的方式返回,以all_users()函数为例 ```python { "info": [ { "info": "aDmin!", "name": "admin", "pers": [ # User包含pers { "write": true, "user_id": 1, "set_id": 2 } ], "is_admin": true, "sets": [ # User包含sets { "pers": [], "info": "this is a user1's set!", "user_id": 1, "id": 1, "name": "set1" } ], "password": "admin", "id": 1 }, { "info": "this is a test user!", "name": "user1", "pers": [], "is_admin": false, "sets": [ { "pers": [ # Set 包含pers { "write": true, "user_id": 1, "set_id": 2 } ], "info": "this is a user2's set!", "user_id": 2, "id": 2, "name": "set2" } ], "password": "admin", "id": 2 } ], "return": true } ``` #UI and PY #文件操作 *Create by WSQ --2017.10.22* ## 说明: 1. 若服务器端以root用户运行脚本,此可以访问**服务器内任何文件**.客户端须谨慎使用,务必确保用户是否具有相应权限! 2. 为保证脚本洁净且不会阻塞客户端,函数**不会监测文件下载/上传进度**且**不会检测文件下载/上传是否正确**.客户端可以根据文件的实际大小以及当前文件大小计算下载/上传的速度或进度.并且在文件下载/上传完成后检查文件正确性以决定是否留存文件. ### 监测文件进度的python-demo: ```python # 转换文件大小单位 def my_size(size, index=0): DI = ["B", "KB", "MB", "GB", "TB", "PB", "EB"] if size < 1000: return str(size) + DI[index] else: return my_size(float(size / 1024), index + 1) # 每隔'span'秒 输出速度和进度 伪多线程 class MyTimer: def __init__(self, span=1): self.start = 0 self.differ = span self.filesize = 0 # span时间内重复调用此函数 def get(self, filesize, total): if self.start == 0: self.start = datetime.now() self.filesize = filesize return None elif (datetime.now() - self.start).seconds >= self.span: self.start = datetime.now() speed = my_size(filesize - self.filesize) + "/" + str(self.span) + "s" try: process = str('%.2f%%' % (float(filesize) / float(total) * 100)) except ZeroDivisionError: process = "0%" self.filesize = filesize return speed + '\t' + process ``` ## 获取文件信息 获取服务器文件信息,可获取的属性暂时为size,md5,permission,视需求而定. ```python # 避免重复进行某些不必要的耗时操作 def getfile(server_path,size=False,md5=False,permission=False) return [True,fileinfo] or [False,info] # UI->PY { "command":"getfile", "argv":{ "server_path":"//root/下载/mongodb-linux-x86_64-ubuntu1204-3.4.5.tgz", "size": True } or { "command":"getfile", "argv":{ "server_path":"//root/下载/mongodb-linux-x86_64-ubuntu1204-3.4.5.tgz", "md5":True, "permission":True } } #PY->UI { "return":True, "file_info":{ "size": 1042734 } or { "return":True, "file_info":{ "md5": "e2656285ef19442c600d6c0087bc9a25", "permission":"xxx" # 格式待定 } ``` ## 下载文件 ```python def download(client_path,server_path): return True or [False,info] # UI->PY { "command":"download", "argv":{ "client_path":"cfile/mongodb-linux-x86_64-ubuntu1204-3.4.5.tgz", # 相对路径 "server_path":"//root/下载/mongodb-linux-x86_64-ubuntu1204-3.4.5.tgz" # 绝对路径 # 相对路径与绝对路径均可 } } ``` ## 上传文件 ```python def upload(client_path,server_path): return return True or [False,info] ```