first commit
This commit is contained in:
.gitignoreSetParams.zipnohup.outpytest.inirequirements.txtrequirements_p37.txtsetparams.py
SetParams
SetParams_Demo.py__init__.pyapp
__init__.py
deploy.shdocker-compose.ymlconfigs
controller
core
exts.pyfile_tool.pyjson_util.pymodels
run.pyschemas
services
utils
DateTimeUtil.pyEncryptionTool.pyJSONEncodeTools.pyRedisMQTool.pySimpleSqlite3Tool.pySnowflakeTool.pyStandardizedOutput.pyUDPReceive.pyUDPSender.pyWebsocketClient.pyYamlTool.py__init__.pyredis_config.pywebsocket_tool.py
yolov5
.dockerignore.gitattributesdetect_server.pyexport.pyhubconf.py
.github
CODE_OF_CONDUCT.md
.gitignore.pre-commit-config.yamlCONTRIBUTING.mdLICENSEREADME.mdISSUE_TEMPLATE
PULL_REQUEST_TEMPLATE.mdREADME_cn.mdSECURITY.mddependabot.ymlworkflows
classify
data
Argoverse.yamlGlobalWheat2020.yamlImageNet.yamlObjects365.yamlSKU-110K.yamlVOC.yamlVisDrone.yamlcoco.yamlcoco128 - 副本.yamlcoco128.yaml
hyps
scripts
xView.yamldata_set
170111334447456256
models
__init__.pycommon.pyexperimental.py
train_server.pytutorial.ipynbhub
anchors.yamlyolov3-spp.yamlyolov3-tiny.yamlyolov3.yamlyolov5-bifpn.yamlyolov5-fpn.yamlyolov5-p2.yamlyolov5-p34.yamlyolov5-p6.yamlyolov5-p7.yamlyolov5-panet.yamlyolov5l6.yamlyolov5m6.yamlyolov5n6.yamlyolov5s-ghost.yamlyolov5s-transformer.yamlyolov5s6.yamlyolov5x6.yaml
tf.pyyolo.pyyolov5l.yamlyolov5m.yamlyolov5n.yamlyolov5s.yamlyolov5x.yamlutils
__init__.pyactivations.pyaugmentations.pyautoanchor.pyautobatch.py
val.pyvalidate_server.py圆孔_123_RODY_1_640.zipaws
benchmarks.pycallbacks.pydataloaders.pydocker
downloads.pyflask_rest_api
general.pygoogle_app_engine
loggers
loss.pymetrics.pyplots.pytorch_utils.pydocs
.back_flask_demo
flask_demo-backup-2022812170612.pdma.jsonflask_demo-backup-2022812170618.pdma.jsonflask_demo-backup-2022812170626.pdma.json
flask_demo.pdma.jsonindex.apibtests
125
app/utils/DateTimeUtil.py
Normal file
125
app/utils/DateTimeUtil.py
Normal file
@ -0,0 +1,125 @@
|
||||
# coding:utf-8
|
||||
import time
|
||||
import datetime
|
||||
|
||||
|
||||
def gap_day(time_str, date=None, format="%Y-%m-%d"):
|
||||
"""
|
||||
:判断自然日差几天
|
||||
:param time_str: 2019-02-19 21:49:20
|
||||
:return:
|
||||
"""
|
||||
if not date:
|
||||
date = time.strftime(format)
|
||||
now_day_stamps = time.mktime(time.strptime(date, format))
|
||||
if " " in format:
|
||||
format = format.split(" ")[0]
|
||||
input_stamps = time.mktime(time.strptime(time_str.split(" ")[0], format))
|
||||
return int(abs((now_day_stamps - input_stamps)) // 86400)
|
||||
|
||||
|
||||
def gap_stamps_day(time_str, now_day_stamps=None):
|
||||
"""
|
||||
:判断绝对时间差几天
|
||||
:param time_str: 2019-02-19 21:49:20
|
||||
:return:
|
||||
"""
|
||||
if not now_day_stamps:
|
||||
now_day_stamps = time.time()
|
||||
input_stamps = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
|
||||
return int(abs((now_day_stamps - input_stamps)) // 86400)
|
||||
|
||||
|
||||
def gap_stamps_hour(time_str):
|
||||
"""
|
||||
:判断绝对上差几个小时
|
||||
:param time_str: 2019-02-19 21:49:20
|
||||
:return:
|
||||
"""
|
||||
now = int(time.time())
|
||||
input_stamps = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
|
||||
return int(abs((now - input_stamps)) // 3600)
|
||||
|
||||
|
||||
def gap_stamps_minute(time_str):
|
||||
"""
|
||||
:判断绝对上差几个分钟
|
||||
:param time_str: 2019-02-19 21:49:20
|
||||
:return:
|
||||
"""
|
||||
now = int(time.time())
|
||||
input_stamps = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
|
||||
return int(abs((now - input_stamps)) // 60)
|
||||
|
||||
|
||||
def get_now():
|
||||
"""
|
||||
获取当前时间 YYYY-MM-DD HH:mm:ss
|
||||
:param
|
||||
:return:
|
||||
"""
|
||||
current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||||
return current_time
|
||||
|
||||
|
||||
def get_time_stamp(timeStr, format="%Y-%m-%d %H:%M:%S"):
|
||||
"""
|
||||
获取时间戳
|
||||
:param timeStr: 2019-05-12 09:00:00
|
||||
:param format: "%Y-%m-%d %H:%M:%S"
|
||||
:return:
|
||||
"""
|
||||
timeArray = time.strptime(timeStr, format)
|
||||
timestamp = time.mktime(timeArray)
|
||||
return int(timestamp)
|
||||
|
||||
|
||||
def gap_stamps_sec(time_str):
|
||||
"""
|
||||
:判断绝对上差几秒
|
||||
:param time_str: 2019-02-19 21:49:20
|
||||
:return:
|
||||
"""
|
||||
|
||||
now = int(time.time())
|
||||
input_stamps = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
|
||||
return int(abs((now - input_stamps)))
|
||||
|
||||
|
||||
def get_day_jia(date, n, format='%Y-%m-%d'):
|
||||
"""
|
||||
时间加n天
|
||||
:param date:
|
||||
:param n:
|
||||
:return:
|
||||
"""
|
||||
jia_date = datetime.datetime.strptime(date, format)
|
||||
jia_date = jia_date + datetime.timedelta(days=n)
|
||||
return jia_date.strftime(format)
|
||||
|
||||
|
||||
def get_sec_jia(seconds, format="%Y-%m-%d %H:%M:%S"):
|
||||
"""
|
||||
当前时间加多少秒
|
||||
:param seconds:
|
||||
:param format:
|
||||
:return: 2019-12-30 19:25:30
|
||||
"""
|
||||
return (datetime.datetime.now() + datetime.timedelta(seconds=seconds)).strftime(format)
|
||||
|
||||
|
||||
def get_ts_to_time(ts):
|
||||
"""时间戳转字符串"""
|
||||
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts))
|
||||
|
||||
|
||||
def day_long(time1, time2):
|
||||
"""
|
||||
计算时间差
|
||||
:return: 相差的天数
|
||||
"""
|
||||
ts1 = get_time_stamp(time1)
|
||||
ts2 = get_time_stamp(time2)
|
||||
date1 = datetime.datetime.fromtimestamp(ts1)
|
||||
date2 = datetime.datetime.fromtimestamp(ts2)
|
||||
return abs(int((date2 - date1).days))
|
24
app/utils/EncryptionTool.py
Normal file
24
app/utils/EncryptionTool.py
Normal file
@ -0,0 +1,24 @@
|
||||
import hashlib
|
||||
import uuid
|
||||
|
||||
|
||||
def sha256_encode(contents: str):
|
||||
res = hashlib.sha256(b"%b" % contents.encode("utf8")).hexdigest()
|
||||
return res
|
||||
|
||||
|
||||
def sha3_256_encode(contents: str):
|
||||
res = hashlib.sha3_256(b"%b" % contents.encode("utf8")).hexdigest()
|
||||
return res
|
||||
|
||||
|
||||
def generate_uuid():
|
||||
return uuid.uuid4()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(hashlib.algorithms_guaranteed)
|
||||
print(hashlib.algorithms_available)
|
||||
print(sha256("res"))
|
||||
print(sha3_256("res" + generate_uuid().hex))
|
||||
print(generate_uuid().hex)
|
21
app/utils/JSONEncodeTools.py
Normal file
21
app/utils/JSONEncodeTools.py
Normal file
@ -0,0 +1,21 @@
|
||||
"""
|
||||
@Time : 2022/10/17 10:12
|
||||
@Auth : 东
|
||||
@File :JSONEncodeTools.py
|
||||
@IDE :PyCharm
|
||||
@Motto:ABC(Always Be Coding)
|
||||
@Desc:
|
||||
|
||||
"""
|
||||
import datetime
|
||||
import json
|
||||
|
||||
|
||||
class MyEncoder(json.JSONEncoder):
|
||||
def default(self, obj):
|
||||
if isinstance(obj, bytes):
|
||||
return str(obj, encoding='utf-8')
|
||||
if isinstance(obj, datetime.datetime):
|
||||
return str(obj)
|
||||
|
||||
return json.JSONEncoder.default(self, obj)
|
42
app/utils/RedisMQTool.py
Normal file
42
app/utils/RedisMQTool.py
Normal file
@ -0,0 +1,42 @@
|
||||
"""
|
||||
@Time : 2022/10/9 17:50
|
||||
@Auth : 东
|
||||
@File :RedisMQTool.py
|
||||
@IDE :PyCharm
|
||||
@Motto:ABC(Always Be Coding)
|
||||
@Desc:
|
||||
|
||||
"""
|
||||
import json
|
||||
|
||||
import redis
|
||||
|
||||
|
||||
class Task(object):
|
||||
|
||||
def __init__(self, redis_conn, channel):
|
||||
self.rcon = redis_conn
|
||||
self.ps = self.rcon.pubsub()
|
||||
self.key = 'task:pubsub:%s' % channel
|
||||
self.ps.subscribe(self.key)
|
||||
|
||||
def listen_task(self):
|
||||
for i in self.ps.listen():
|
||||
if i['type'] == 'message':
|
||||
print("Task get ", i["data"])
|
||||
|
||||
def publish_task(self, data):
|
||||
self.rcon.publish(self.key, json.dumps(data))
|
||||
|
||||
def del_listen(self):
|
||||
self.ps.unsubscribe(self.key)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("listen task channel")
|
||||
|
||||
pool = redis.ConnectionPool(host='127.0.0.1',
|
||||
port=6379, db=5,)
|
||||
|
||||
redis_conn = redis.StrictRedis(connection_pool=pool)
|
||||
Task(redis_conn, 'channel').listen_task()
|
95
app/utils/SimpleSqlite3Tool.py
Normal file
95
app/utils/SimpleSqlite3Tool.py
Normal file
@ -0,0 +1,95 @@
|
||||
# coding: utf-8
|
||||
# Author:tajochen
|
||||
|
||||
import sqlite3
|
||||
import os
|
||||
|
||||
|
||||
class SimpleSQLite3Tool:
|
||||
"""
|
||||
simpleToolSql for sqlite3
|
||||
简单数据库工具类
|
||||
编写这个类主要是为了封装sqlite,继承此类复用方法
|
||||
"""
|
||||
|
||||
|
||||
def __init__(self, filename="stsql"):
|
||||
"""
|
||||
初始化数据库,默认文件名 stsql.db
|
||||
filename:文件名
|
||||
"""
|
||||
self.filename = filename
|
||||
self.db = sqlite3.connect(self.filename)
|
||||
self.c = self.db.cursor()
|
||||
|
||||
|
||||
def close(self):
|
||||
"""
|
||||
关闭数据库
|
||||
"""
|
||||
self.c.close()
|
||||
self.db.close()
|
||||
|
||||
|
||||
def execute(self, sql, param=None):
|
||||
"""
|
||||
执行数据库的增、删、改
|
||||
sql:sql语句
|
||||
param:数据,可以是list或tuple,亦可是None
|
||||
return:成功返回True
|
||||
"""
|
||||
try:
|
||||
if param is None:
|
||||
self.c.execute(sql)
|
||||
else:
|
||||
if type(param) is list:
|
||||
self.c.executemany(sql, param)
|
||||
else:
|
||||
self.c.execute(sql, param)
|
||||
count = self.db.total_changes
|
||||
self.db.commit()
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return False, e
|
||||
if count > 0:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def query(self, sql, param=None):
|
||||
"""
|
||||
查询语句
|
||||
sql:sql语句
|
||||
param:参数,可为None
|
||||
return:成功返回True
|
||||
"""
|
||||
if param is None:
|
||||
self.c.execute(sql)
|
||||
else:
|
||||
self.c.execute(sql, param)
|
||||
return self.c.fetchall()
|
||||
|
||||
|
||||
# def set(self,table,field=" * ",where="",isWhere=False):
|
||||
# self.table = table
|
||||
# self.filed = field
|
||||
# if where != "" :
|
||||
# self.where = where
|
||||
# self.isWhere = True
|
||||
# return True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 数据库文件位置
|
||||
sql = SimpleSQLite3Tool("../test.db")
|
||||
f = sql.execute("create table test (id int not null,name text not null,age int);")
|
||||
print("ok")
|
||||
sql.execute("insert into test (id,name,age) values (?,?,?);", [(1, 'abc', 15), (2, 'bca', 16)])
|
||||
res = sql.query("select * from test;")
|
||||
print(res)
|
||||
sql.execute("insert into test (id,name) values (?,?);", (3, 'bac'))
|
||||
res = sql.query("select * from test where id=?;", (3,))
|
||||
res = sql.query("select * from data_collection_info;")
|
||||
print(res)
|
||||
sql.close()
|
82
app/utils/SnowflakeTool.py
Normal file
82
app/utils/SnowflakeTool.py
Normal file
@ -0,0 +1,82 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
@author: cxyfreedom
|
||||
@desc: 基于 snowflake 生成分布式ID
|
||||
"""
|
||||
import time
|
||||
|
||||
# 每一部分占用的位数
|
||||
TIMESTAMP_BIT = 41 # 时间戳占用位数
|
||||
MACHINE_BIT = 5 # 机器标识占用的位数
|
||||
DATACENTER_BIT = 5 # 数据中心占用的位数
|
||||
SEQUENCE_BIT = 12 # 序列号占用的位数
|
||||
|
||||
# 每一部分的最大值
|
||||
MAX_DATACENTER_NUM = -1 ^ (-1 << DATACENTER_BIT)
|
||||
MAX_MACHINE_NUM = -1 ^ (-1 << MACHINE_BIT)
|
||||
MAX_SEQUENCE = -1 ^ (-1 << SEQUENCE_BIT)
|
||||
|
||||
# 每一部分向左的位移
|
||||
MACHINE_LEFT = SEQUENCE_BIT
|
||||
DATACENTER_LEFT = MACHINE_BIT + SEQUENCE_BIT
|
||||
TIMESTAMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT
|
||||
|
||||
|
||||
class SnowFlake:
|
||||
class OverflowError(TypeError):
|
||||
"""
|
||||
分布式ID生成算法占位符溢出异常,会导致生成ID为负数
|
||||
"""
|
||||
pass
|
||||
|
||||
class RuntimeError(TypeError):
|
||||
"""
|
||||
运行时间错误,在此项目中当前运行时间小于上一次运行时间。
|
||||
"""
|
||||
pass
|
||||
|
||||
def __init__(self):
|
||||
if TIMESTAMP_BIT + SEQUENCE_BIT + MACHINE_BIT + DATACENTER_BIT != 63:
|
||||
raise self.OverflowError(
|
||||
"TIMESTAMP_BIT + SEQUENCE_BIT + MACHINE_BIT + DATACENTER_BIT not equal to 63bit")
|
||||
self.datacenter_id = 0 # 数据中心编号
|
||||
self.machineId = 0 # 机器标识编号
|
||||
self.sequence = 0 # 序列号
|
||||
self.last_stamp = -1 # 上一次时间戳
|
||||
|
||||
def nextId(self):
|
||||
"""生成下一个ID"""
|
||||
cur_stamp = self.get_new_stamp()
|
||||
if cur_stamp < self.last_stamp:
|
||||
raise self.RuntimeError(
|
||||
"Clock moved backwards. Refusing to generate id")
|
||||
|
||||
if cur_stamp == self.last_stamp:
|
||||
# 相同毫秒内,序列号自增
|
||||
self.sequence = (self.sequence + 1) & MAX_SEQUENCE
|
||||
# 同一秒的序列数已经达到最大
|
||||
if self.sequence == 0:
|
||||
cur_stamp = self.get_next_mill()
|
||||
else:
|
||||
# 不同秒内,序列号为0
|
||||
self.sequence = 0
|
||||
|
||||
self.last_stamp = cur_stamp
|
||||
return (cur_stamp << TIMESTAMP_LEFT) | (
|
||||
self.datacenter_id << DATACENTER_LEFT) | (
|
||||
self.machineId << MACHINE_LEFT) | self.sequence
|
||||
|
||||
def get_next_mill(self):
|
||||
mill = self.get_new_stamp()
|
||||
while mill <= self.last_stamp:
|
||||
mill = self.get_new_stamp()
|
||||
return mill
|
||||
|
||||
@staticmethod
|
||||
def get_new_stamp():
|
||||
now = lambda: int(time.time() * 1000)
|
||||
return now()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(SnowFlake().nextId())
|
5
app/utils/StandardizedOutput.py
Normal file
5
app/utils/StandardizedOutput.py
Normal file
@ -0,0 +1,5 @@
|
||||
from flask import jsonify
|
||||
|
||||
|
||||
def output_wrapped(status: int = 0, message: str = "", data: object = None):
|
||||
return jsonify(code=status, message=message, data=data)
|
53
app/utils/UDPReceive.py
Normal file
53
app/utils/UDPReceive.py
Normal file
@ -0,0 +1,53 @@
|
||||
#!/usr/bin/python3
|
||||
# coding= utf-8
|
||||
|
||||
import socket
|
||||
import sys
|
||||
import struct
|
||||
import json
|
||||
|
||||
# 本机信息
|
||||
import time
|
||||
|
||||
host_ip = socket.gethostbyname(socket.gethostname())
|
||||
# 组播组IP和端口
|
||||
mcast_group_ip = '224.1.1.1'
|
||||
mcast_group_port = 2234
|
||||
|
||||
|
||||
def receiver():
|
||||
# 建立接收 udp socket
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
||||
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
||||
# linux能绑定网卡这里绑定组播IP地址不会服错,windows没法绑定网卡只能绑定本网卡IP地址
|
||||
if "linux" in sys.platform:
|
||||
# 绑定到的网卡名,如果自己的不是eth0则修改
|
||||
nic_name = 0
|
||||
# 监听的组播地址
|
||||
sock.setsockopt(socket.SOL_SOCKET, 25, nic_name)
|
||||
sock.bind((mcast_group_ip, mcast_group_port))
|
||||
else:
|
||||
sock.bind((host_ip, mcast_group_port))
|
||||
# 加入组播组
|
||||
mq_request = struct.pack("=4sl", socket.inet_aton(mcast_group_ip), socket.INADDR_ANY)
|
||||
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mq_request)
|
||||
# 设置非阻塞
|
||||
sock.setblocking(True)
|
||||
while True:
|
||||
try:
|
||||
data, address = sock.recvfrom(4096)
|
||||
data2 = json.loads(data)
|
||||
# 若组播数据不正确
|
||||
if len(data2) < 3:
|
||||
return
|
||||
except socket.error as e:
|
||||
print(f"while receive message error occur:{e}")
|
||||
else:
|
||||
print("Receive Data!")
|
||||
print("FROM: ", address)
|
||||
print("DATA: ", data.decode('utf-8'))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
receiver()
|
32
app/utils/UDPSender.py
Normal file
32
app/utils/UDPSender.py
Normal file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/python3
|
||||
# coding= utf-8
|
||||
|
||||
import time
|
||||
import struct
|
||||
import socket
|
||||
|
||||
# 本机信息
|
||||
host_ip = socket.gethostname()
|
||||
host_port = 6501
|
||||
# 组播组IP和端口
|
||||
mcast_group_ip = '239.255.255.252'
|
||||
mcast_group_port = 5678
|
||||
|
||||
|
||||
def sender():
|
||||
send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
||||
send_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
||||
send_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
send_sock.bind((host_ip, host_port))
|
||||
# 设置存活时长
|
||||
ttl_bin = struct.pack('@i', 255)
|
||||
send_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin)
|
||||
while True:
|
||||
data = '12345 english 汉字#测试'
|
||||
send_sock.sendto(str(data).encode('utf-8'), (mcast_group_ip, mcast_group_port))
|
||||
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: send finish.')
|
||||
time.sleep(10)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sender()
|
29
app/utils/WebsocketClient.py
Normal file
29
app/utils/WebsocketClient.py
Normal file
@ -0,0 +1,29 @@
|
||||
"""
|
||||
@Time : 2022/10/11 16:43
|
||||
@Auth : 东
|
||||
@File :WebsocketClient.py
|
||||
@IDE :PyCharm
|
||||
@Motto:ABC(Always Be Coding)
|
||||
@Desc:
|
||||
|
||||
"""
|
||||
from threading import Thread
|
||||
|
||||
import websocket
|
||||
|
||||
def connect(self, apiKey, secretKey, trace=False):
|
||||
self.host = OKEX_USD_CONTRACT
|
||||
self.apiKey = apiKey
|
||||
self.secretKey = secretKey
|
||||
self.trace = trace
|
||||
|
||||
websocket.enableTrace(trace)
|
||||
|
||||
self.ws = websocket.WebSocketApp(self.host,
|
||||
on_message=self.onMessage,
|
||||
on_error=self.onError,
|
||||
on_close=self.onClose,
|
||||
on_open=self.onOpen)
|
||||
|
||||
self.thread = Thread(target=self.ws.run_forever, args=(None, None, 60, 30))
|
||||
self.thread.start()
|
40
app/utils/YamlTool.py
Normal file
40
app/utils/YamlTool.py
Normal file
@ -0,0 +1,40 @@
|
||||
import yaml
|
||||
import os
|
||||
|
||||
|
||||
# 单个文档
|
||||
def get_yaml_data(yaml_file):
|
||||
# 打开yaml文件
|
||||
file = open(yaml_file, 'r', encoding='utf-8')
|
||||
file_data = file.read()
|
||||
file.close()
|
||||
# 将字符串转化为字典或列表
|
||||
data = yaml.safe_load(file_data) # safe_load,safe_load,unsafe_load
|
||||
return data
|
||||
|
||||
|
||||
# yaml文件中含多个文档时,分别获取文档中数据
|
||||
def get_yaml_load_all(yaml_file):
|
||||
# 打开文件
|
||||
file = open(yaml_file, 'r', encoding='utf-8')
|
||||
file_data = file.read()
|
||||
file.close()
|
||||
|
||||
all_data = yaml.load_all(file_data, Loader=yaml.FullLoader)
|
||||
for data in all_data:
|
||||
print('data-----', data)
|
||||
|
||||
|
||||
# 生成yaml文档
|
||||
def generate_yaml_doc(yaml_file):
|
||||
py_ob = {"school": "zhang", "students": ['a', 'b']}
|
||||
file = open(yaml_file, 'w', encoding='utf-8')
|
||||
yaml.dump(py_ob, file)
|
||||
file.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
current_path = os.path.abspath("../../")
|
||||
yaml_path = os.path.join(current_path, "config.yaml")
|
||||
print('--------------------', yaml_path)
|
||||
get_yaml_data(yaml_path)
|
0
app/utils/__init__.py
Normal file
0
app/utils/__init__.py
Normal file
66
app/utils/redis_config.py
Normal file
66
app/utils/redis_config.py
Normal file
@ -0,0 +1,66 @@
|
||||
"""
|
||||
redis 配置类
|
||||
"""
|
||||
import sys
|
||||
|
||||
import redis
|
||||
|
||||
from ..configs import default
|
||||
|
||||
|
||||
class RedisCli(object):
|
||||
|
||||
def __init__(self, *, host: str, port: str, password: str, db: int, socket_timeout=5):
|
||||
# redis对象,在 @app.on_event('startup') 中连接创建
|
||||
self._redis_client = None
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.password = password
|
||||
self.db = db
|
||||
self.socket_timeout = socket_timeout
|
||||
|
||||
def init_redis_connect(self) -> None:
|
||||
"""
|
||||
初始化链接
|
||||
:return:
|
||||
"""
|
||||
try:
|
||||
r = redis.ConnectionPool(
|
||||
host=self.host,
|
||||
port=self.port,
|
||||
password=self.password,
|
||||
db=self.db,
|
||||
socket_timeout=self.socket_timeout,
|
||||
decode_responses=True # 解码
|
||||
)
|
||||
self._redis_client = redis.StrictRedis(connection_pool=r)
|
||||
if not self._redis_client.ping():
|
||||
print('连接超时')
|
||||
sys.exit()
|
||||
except (redis.AuthenticationError, Exception) as e:
|
||||
print('连接redis异常')
|
||||
sys.exit()
|
||||
|
||||
def get_redis(self):
|
||||
return self._redis_client
|
||||
|
||||
# 使实例化后的对象,赋予redis对象的方法和属性
|
||||
def __getattr__(self, item):
|
||||
return self._redis_client.has_key(item)
|
||||
|
||||
def __getitem__(self, item):
|
||||
return self._redis_client[item]
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
self._redis_client[key] = value
|
||||
|
||||
def __delitem__(self, key):
|
||||
del self._redis_client[key]
|
||||
|
||||
|
||||
redis_client = RedisCli(
|
||||
host=default.db['host'],
|
||||
port=default.db['port'],
|
||||
password=default.db['password'],
|
||||
db=default.db['db'],
|
||||
)
|
60
app/utils/websocket_tool.py
Normal file
60
app/utils/websocket_tool.py
Normal file
@ -0,0 +1,60 @@
|
||||
"""
|
||||
@Time : 2022/10/12 17:55
|
||||
@Auth : 东
|
||||
@File :websocket_tool.py
|
||||
@IDE :PyCharm
|
||||
@Motto:ABC(Always Be Coding)
|
||||
@Desc:
|
||||
|
||||
"""
|
||||
import json
|
||||
from typing import Union, List, Dict
|
||||
|
||||
from app.core.common_utils import logger
|
||||
from app.utils.JSONEncodeTools import MyEncoder
|
||||
|
||||
|
||||
class WebsocketUtil:
|
||||
def __init__(self):
|
||||
self.active_connections: List = []
|
||||
self.active_connections_dist: Dict = {}
|
||||
|
||||
def connect(self, ws, id: str):
|
||||
# 等待连接
|
||||
msg = ws.receive()
|
||||
# 存储ws连接对象
|
||||
self.active_connections.append(ws)
|
||||
if id in self.active_connections_dist:
|
||||
self.active_connections_dist[id].append(ws)
|
||||
else:
|
||||
ws_list = [ws, ]
|
||||
self.active_connections_dist[id] = ws_list
|
||||
|
||||
def disconnect(self, ws, id):
|
||||
# ws关闭时 移除ws对象
|
||||
if ws.closed:
|
||||
if ws in self.active_connections_dist.values():
|
||||
self.active_connections.remove(ws)
|
||||
self.active_connections_dist[id].pop(ws)
|
||||
|
||||
@staticmethod
|
||||
async def send_personal_message(message: str, ws):
|
||||
# 发送个人消息
|
||||
await ws.send(message)
|
||||
|
||||
def broadcast(self, message: str):
|
||||
# 广播消息
|
||||
for connection in self.active_connections:
|
||||
connection.send(message)
|
||||
|
||||
def send_message_proj_json(self, message: Union[str, int, List, Dict], id: str):
|
||||
# 广播该项目的消息
|
||||
for connection in self.active_connections_dist[id]:
|
||||
try:
|
||||
connection.send(json.dumps(message, cls=MyEncoder, indent=4), )
|
||||
except Exception as e:
|
||||
logger.error("websocket异常断开,{}", e)
|
||||
self.disconnect(ws=connection, id=id)
|
||||
|
||||
|
||||
manager = WebsocketUtil()
|
Reference in New Issue
Block a user