Tcloud 云测平台-使用介绍

Tcloud使用介绍

前端github地址:https://github.com/bigbaser/Tcloud
后端github地址:https://github.com/bigbaser/TcloudServer
体验地址:http://tcloud-demo.innotechx.com/#/login (账号:admin 密码:123456)
功能介绍:https://testerhome.com/topics/20491

一、目录介绍

TcloudServer目录

 

 
目录名称说明
TcloudServer项目根目录
apps多服务目录,该目录下的每个文件夹代表一个服务
deploy部署文件存放目录
library通用库
apidoc.json用于生产 apidoc 文档
docker-compose.ymldocker compose 配置文件
local_config.py配置文件(本地),存放一些敏感配置
Pipfilepipenv 使用的 包管理 配置
public_config.py通用配置文件
requirement.txtpip install -r 使用的文件
 
apps目录

要添加新的模块或者服务,需要放置在本目录下。

 

 

 

目录名称说明
auth用户以及鉴权相关
autotest自动化测试
extentionCI,小工具
flow流程管理
interface接口自动化
jobs定时任务
message站内信
project项目
public公共库
tcdevices云真机
wsweb socket
library目录

通用的方法提取出来分类放到对应文件中。

 

 

 

目录名称说明
api接口使用相关
notification.py用来发送信息(站内信和企业微信通知)
oss.pyoss 相关
tlogger.py日志相关
trpc.pyrpc 用于服务间调用,目前使用 http 协议

api

目录名称说明
db.py数据库相关,包括 db 和 model 定义
exceptions.py异常定义
parse.pyrequest 请求参数处理
render.pyresponse 数据格式化
security.pyrequest 请求参数格式校验
tBlueprint.py定义 blueprint,并对 get 和 delete 进行权限校验
tFlask.py实现 TFlask 继承自 Flask,重写了 run 用于使用 gunicorn 启动,重写了 make_response 用于处理 response 格式化
tMiddleware.py定义了用于处理 before_request 和 error_request 的中间函数
transfer.py用于 格式化 数据库获取的结果
单个服务的项目结构,以 auth 为例子
  • 目前整个项目后端是 多服务 结构,每个服务负责的内容相对独立。
  • 由于项目是 前后端分离的,所以后端只提供接口供前端进行调用。
  • 整体架构是基于 flask、flask-sqlalchemy 进行构建的 非典型的 mvc 架构(model-view-controller)
目录结构

 

 

 

目录名称说明
auth服务名称/服务根目录
businesscontroller 所在目录,用于具体的逻辑构建
models存放所有的 model,用于定义数据模型和数据库进行对应
settings每个 服务独有 的配置信息
validatons用于前面的 parse 和 security 的数据获取和数据校验 配置文件
views存放所有 views
auth_require.py鉴权相关
extentins.py用于定义服务中使用的其他扩展
run.py服务启动

 

 

 

二、新建服务示例

创建一个新的服务,以 auth 中的 user 为例子,创建一个 /v1/user/add 接口

创建目录结构

 

 

 

配置 config

apps/user/settings/config.py

try:
from public_config import *
except ImportError:
pass

# 端口号是自定义的,需要规划好扩展及其他的服务端口
PORT = 9999
# 服务名称与 目录名称 相同:user
SERVICE_NAME = 'user'

添加 extentions

apps/user/extentions.py

这个文件大部分是通用的库初始化的过程,主要有 初始化 validation,parse 等工具

import os
from os.path import join, abspath, dirname, splitext

import yaml

from library.api.parse import TParse
from library.api.security import Validation

current_path = dirname(abspath(__file__))

yml_json = {}

try:
validate_yml_path = join(current_path, 'validations')
for fi in os.listdir(validate_yml_path):
if splitext(fi)[-1] != '.yml':
continue
with open(join(validate_yml_path, fi), 'rb') as f:
yml_json.update(yaml.safe_load(f.read()))
except yaml.YAMLError as e:
print(e)

v = Validation(yml_json)
validation = v.validation

p = TParse(yml_json)
parse_list_args = p.parse_list_args
parse_list_args2 = p.parse_list_args2
parse_json_form = p.parse_json_form
parse_pwd = p.parse_pwd

定义接口

/user/add

属性
路径/user/add
方法POST
参数{"name":"hello", "nickname":"world", "password":"helloworld"}

首先定义 user 的 model

apps/user/models/users.py

from library.api.db import db, EntityWithNameModel

# 使用 含有 name 的模型进行继承,这样默认便会含有 namecreation_time, modified_time
# 数据库表名 与定义的模型名称的小写全拼相同,但驼峰式命名会转化为 _ 的格式。
# User == user, UserDetail == user_detail


# 定义 User 模型
class User(EntityWithNameModel):
ACTIVE = 0
DISABLE = 1

nickname = db.Column(db.String(100), nullable=True) # 昵称
password = db.Column(db.String(100), nullable=False) # 密码
status = db.Column(db.Integer, default=ACTIVE) # 状态,0:存在,1:删除

然后编写 用户添加数据库逻辑

apps/user/business/users.py

from flask import current_app

from apps.user.extentions import parse_pwd
from apps.user.models.users import User
from library.api.db import db


# 创建 UserBusiness
class UserBusiness(object):

@classmethod
def create_new_user_and_bind_roles(cls, username, nickname, password):
# 传入 需要的参数
try:
# 查询是否已经存在当前用户名的用户
ret = User.query.filter(User.name == username, User.status == User.ACTIVE).first()
if ret:
return 103, None
# 构建 User,使用 parse_pwd 加密 password 为密文
n = User(
name=username,
nickname=nickname,
password=parse_pwd(password)
)
# 使用 db 添加到数据库
db.session.add(n)
db.session.commit()
return 0, None
except Exception as e:
current_app.logger.error(str(e))
return 102, str(e)

添加 需要校验数据的 配置文件

apps/user/validations/users.yml
required: True代表字段必填

adduser:
username:
required: True
type: basestring
nickname:
required: True
type: basestring
password:
required: True
type: basestring
returnvalue:
- username
- nickname
- password

然后编写 用户添加接口 逻辑

apps/user/views/users.py

from apps.user.business.users import UserBusiness
from apps.user.extentions import validation, parse_json_form
from library.api.tBlueprint import tblueprint

# 创建 blueprint
user = tblueprint("user", __name__, bpname="user", has_view=False)


# 定义 /add 路径 请求方法 POST
@user.route('/add', methods=['POST'])
@validation('POST:adduser') # 用于数据校验,主要从 validations/users.yml 中读取
def user_index_handler():
# validations/users.yml 中读取
username, nickname, password = parse_json_form('adduser')
ret, msg = UserBusiness.create_new_user_and_bind_roles(username, nickname, password)
return {
"code": ret,
"data": [],
"message": msg
}

定义 app

apps/user/run.py


from apps.user.settings import config

if config.SERVER_ENV != 'dev':
# 猴子补丁,用于 gunicorn 启动。
from gevent import monkey
monkey.patch_all()
else:
pass

from apps.user.views.users import user
from library.api.tFlask import tflask


# 使用 create_app 创建 app
def create_app():
app = tflask(config)
register_blueprints(app)
return app


# 注册 blueprint app
def register_blueprints(app):
app.register_blueprint(user, url_prefix="/v1/user")


# 启动应用
if __name__ == '__main__':
create_app().run(port=config.PORT)

启动 app

python3 -m apps.user.run 

 

 

 

访问 POST

 

 

 

登录一下,将返回的 token 填入 header 的 Authorization 中

 

 

 

填写 请求的 Body (缺少参数)

类型为 json 格式

{
"username": "test"
}

可以看到 返回为 缺少参数

 

 

 

后台报错信息

 

 

 

填写 完整的 body

{
"username": "hello",
"password": "helloworld",
"nickname": "world"
}

 

 

 

平台目前在持续更新维护,如有疑问或帮助可联系QQ群:839084842

如果项目对你有所帮助或启发,希望能在GitHub点个Star,感谢阅读!

转载于:https://www.cnblogs.com/grizz/p/11540422.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值