正在显示
7 个修改的文件
包含
204 行增加
和
175 行删除
| ... | ... | @@ -15,6 +15,7 @@ import logging |
| 15 | 15 | from app.util.component.StructuredPrint import StructurePrint |
| 16 | 16 | from app.util.component.PGUtil import PGUtil |
| 17 | 17 | import os |
| 18 | +from app.modules.monitor.schedule import start_schedule | |
| 18 | 19 | |
| 19 | 20 | |
| 20 | 21 | class JSONEncoder(_JSONEncoder): |
| ... | ... | @@ -92,5 +93,7 @@ def create_app(): |
| 92 | 93 | |
| 93 | 94 | # 不检测https |
| 94 | 95 | os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' |
| 96 | + | |
| 97 | + # start_schedule() | |
| 95 | 98 | return app |
| 96 | 99 | ... | ... |
app/modules/monitor.zip
0 → 100644
不能预览此文件类型
| ... | ... | @@ -7,7 +7,7 @@ |
| 7 | 7 | from flasgger import swag_from |
| 8 | 8 | from flask import Blueprint |
| 9 | 9 | from app.util import BlueprintApi |
| 10 | -from . import monitor_info, monitoring, metrics, monitor_host_create, monitor_host_list, monitor_host_delete, monitor_host_edit | |
| 10 | +from . import monitoring, metrics, monitor_host_create, monitor_host_list, monitor_host_delete, monitor_host_edit | |
| 11 | 11 | |
| 12 | 12 | |
| 13 | 13 | user_socket_list = [] |
| ... | ... | @@ -18,14 +18,14 @@ class Monitor(BlueprintApi): |
| 18 | 18 | |
| 19 | 19 | bp = Blueprint("Monitor", __name__, url_prefix="/API/Monitor") |
| 20 | 20 | |
| 21 | - @staticmethod | |
| 22 | - @bp.route('/Info', methods=['GET']) | |
| 23 | - @swag_from(monitor_info.Api.api_doc) | |
| 24 | - def monitor_info(): | |
| 25 | - """ | |
| 26 | - 性能监控 | |
| 27 | - """ | |
| 28 | - return monitor_info.Api().result | |
| 21 | + # @staticmethod | |
| 22 | + # @bp.route('/Info', methods=['GET']) | |
| 23 | + # @swag_from(monitor_info.Api.api_doc) | |
| 24 | + # def monitor_info(): | |
| 25 | + # """ | |
| 26 | + # 性能监控 | |
| 27 | + # """ | |
| 28 | + # return monitor_info.Api().result | |
| 29 | 29 | |
| 30 | 30 | @staticmethod |
| 31 | 31 | @bp.route('/baseMonitoring', methods=['GET']) | ... | ... |
app/modules/monitor/backgroud_job.py
0 → 100644
| 1 | +import paramiko | |
| 2 | +from .models import MonitorHost, MonitorLog | |
| 3 | +import datetime | |
| 4 | +import math | |
| 5 | +import time | |
| 6 | +import uuid | |
| 7 | +from app.util.component.PGUtil import PGUtil | |
| 8 | +import configure | |
| 9 | +from app.util.component.StructuredPrint import StructurePrint | |
| 10 | +import traceback | |
| 11 | + | |
| 12 | +def background_job(): | |
| 13 | + try: | |
| 14 | + # servers = [{'sid': 'src1', 'hostname': '172.26.99.160', | |
| 15 | + # 'username': 'monitor', 'password': '123456'}, | |
| 16 | + # {'sid': 'src2', 'hostname': '172.26.60.100', | |
| 17 | + # 'username': 'root', 'password': 'DMap@123'}] | |
| 18 | + | |
| 19 | + cur_time = datetime.datetime.now() | |
| 20 | + time_stamp = cur_time.strftime( | |
| 21 | + "%Y-%m-%d %H:%M:%S") | |
| 22 | + struct_time = time.strptime(time_stamp, "%Y-%m-%d %H:%M:%S") | |
| 23 | + d_minu_stamp = math.floor(struct_time.tm_min/10) | |
| 24 | + f_minu_stamp = math.floor(struct_time.tm_min/5) | |
| 25 | + | |
| 26 | + sys_session = PGUtil.get_db_session( | |
| 27 | + configure.SQLALCHEMY_DATABASE_URI) | |
| 28 | + sys_ds = PGUtil.open_pg_data_source( | |
| 29 | + 0, configure.SQLALCHEMY_DATABASE_URI) | |
| 30 | + | |
| 31 | + hosts = sys_session.query( | |
| 32 | + MonitorHost.host, MonitorHost.user, MonitorHost.password, MonitorHost.type, MonitorHost.srcid) | |
| 33 | + servers = list(map(lambda host: | |
| 34 | + {'hostname': host.host, 'username': host.user, | |
| 35 | + 'password': host.password, 'type': host.type, | |
| 36 | + 'sid': host.srcid}, | |
| 37 | + hosts)) | |
| 38 | + logs = [] | |
| 39 | + for info in servers: | |
| 40 | + try: | |
| 41 | + StructurePrint().print("schedule,host:{},user:{}".format( | |
| 42 | + info['hostname'], info['username'])) | |
| 43 | + # 业务逻辑 | |
| 44 | + client = paramiko.SSHClient() | |
| 45 | + client.set_missing_host_key_policy(paramiko.AutoAddPolicy) | |
| 46 | + client.connect(hostname=info['hostname'], | |
| 47 | + username=info['username'], password=info['password']) | |
| 48 | + | |
| 49 | + # cpu | |
| 50 | + order = "top -b -n1 | sed -n '3p' | awk '{print $2}'" | |
| 51 | + stdin, stdout, stderr = client.exec_command(order) | |
| 52 | + cpu_usage = stdout.read().decode().split("\n")[0] # cpu使用率 | |
| 53 | + | |
| 54 | + # 内存 | |
| 55 | + order = "free -m | sed -n '2p' | awk '{print $2}'" | |
| 56 | + stdin, stdout, stderr = client.exec_command(order) | |
| 57 | + totalMem = stdout.read().decode().split("\n")[0] # 总内存 | |
| 58 | + | |
| 59 | + order = "free -m | sed -n '2p' | awk '{print $7}'" | |
| 60 | + stdin, stdout, stderr = client.exec_command(order) | |
| 61 | + availableMem = stdout.read().decode().split("\n")[0] # 可用内存 | |
| 62 | + | |
| 63 | + order = "free -m | sed -n '2p' | awk '{print $3}'" | |
| 64 | + stdin, stdout, stderr = client.exec_command(order) | |
| 65 | + usedMem = stdout.read().decode().split("\n")[0] # 已用内存 | |
| 66 | + | |
| 67 | + # disk | |
| 68 | + order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $2}' | awk -v total=0 '{total+=$1}END{print total}'" | |
| 69 | + stdin, stdout, stderr = client.exec_command(order) | |
| 70 | + totalDisk = int(stdout.read().decode().split("\n") | |
| 71 | + [0]) # 总磁盘空间,单位Mb | |
| 72 | + | |
| 73 | + order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $3}' | awk -v total=0 '{total+=$1}END{print total}'" | |
| 74 | + stdin, stdout, stderr = client.exec_command(order) | |
| 75 | + usedDisk = int(stdout.read().decode().split("\n") | |
| 76 | + [0]) # 已使用磁盘空间,单位Mb | |
| 77 | + | |
| 78 | + # network | |
| 79 | + # 接收的字节数 | |
| 80 | + rx_time = [] | |
| 81 | + rx_bytes = [] | |
| 82 | + tx_time = [] | |
| 83 | + tx_bytes = [] | |
| 84 | + | |
| 85 | + # 接收的字节数 | |
| 86 | + order = "ifconfig | grep RX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'" | |
| 87 | + i = 0 | |
| 88 | + while i < 2: | |
| 89 | + i = i+1 | |
| 90 | + stdin, stdout, stderr = client.exec_command(order) | |
| 91 | + rx_time.append(time.time()) | |
| 92 | + rx_bytes.append(int(stdout.read().decode().split("\n")[0])) | |
| 93 | + | |
| 94 | + # 发送的字节数 | |
| 95 | + order = "ifconfig | grep TX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'" | |
| 96 | + i = 0 | |
| 97 | + while i < 2: | |
| 98 | + i = i+1 | |
| 99 | + stdin, stdout, stderr = client.exec_command(order) | |
| 100 | + tx_time.append(time.time()) | |
| 101 | + tx_bytes.append(int(stdout.read().decode().split("\n")[0])) | |
| 102 | + | |
| 103 | + log_guid = uuid.uuid1().__str__() | |
| 104 | + monitor_log = MonitorLog(guid=log_guid, | |
| 105 | + server=info["hostname"], | |
| 106 | + time_stamp=cur_time, | |
| 107 | + cpu_usage=float( | |
| 108 | + "%.2f" % float(cpu_usage)), | |
| 109 | + total_mem=totalMem, | |
| 110 | + available_mem=availableMem, | |
| 111 | + used_mem=usedMem, | |
| 112 | + disk=totalDisk, | |
| 113 | + disk_usage=usedDisk, | |
| 114 | + net_recv=float("%.2f" % float(( | |
| 115 | + rx_bytes[1] - rx_bytes[0])/(rx_time[1]-rx_time[0]))), | |
| 116 | + net_send=float("%.2f" % float(( | |
| 117 | + tx_bytes[1] - tx_bytes[0])/(tx_time[1]-tx_time[0]))), | |
| 118 | + date_stamp=cur_time.strftime( | |
| 119 | + "%Y-%m-%d"), | |
| 120 | + hour_stamp=struct_time.tm_hour, | |
| 121 | + minu_stamp=struct_time.tm_min, | |
| 122 | + d_minu_stamp=1 if d_minu_stamp == 0 else d_minu_stamp, | |
| 123 | + f_minu_stamp=1 if f_minu_stamp == 0 else f_minu_stamp) | |
| 124 | + | |
| 125 | + logs.append(monitor_log) | |
| 126 | + | |
| 127 | + except Exception as e: | |
| 128 | + StructurePrint().print(e.__str__()+":" + traceback.format_exc(), "error") | |
| 129 | + sys_session.rollback() | |
| 130 | + sys_session.add_all(logs) | |
| 131 | + sys_session.commit() | |
| 132 | + except Exception as e2: | |
| 133 | + StructurePrint().print(e2.__str__()+":" + traceback.format_exc(), "error") | |
| 134 | + finally: | |
| 135 | + sys_session.rollback() | |
| 136 | + client.close() | |
| 137 | + if sys_session: | |
| 138 | + sys_session.close() | |
| 139 | + if sys_ds: | |
| 140 | + sys_ds.Destroy() | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | +def format_value(value): | |
| 145 | + # 1024*1024*1024 | |
| 146 | + if value > 1_073_741_824: | |
| 147 | + value = "{}GB".format(format(value/1_073_741_824, '.1f')) | |
| 148 | + elif value > 1_048_576: | |
| 149 | + # 1024*1024 | |
| 150 | + value = "{}MB".format(format(value / 1_048_576, '.1f')) | |
| 151 | + elif value > 1024: | |
| 152 | + value = "{}KB".format(format(value / 1024.0, '.1f')) | |
| 153 | + else: | |
| 154 | + value = "{}B".format(format(value, '.1f')) | |
| 155 | + return value | |
| 156 | + | |
| 157 | + | |
| 158 | +def Mb_format_value(value): | |
| 159 | + if value > 1024: | |
| 160 | + value = "{}GB".format(format(value/1024, '.1f')) | |
| 161 | + else: | |
| 162 | + value = "{}MB".format(format(value, '.1f')) | |
| 163 | + return value | ... | ... |
| 1 | 1 | # import schedule |
| 2 | -import os | |
| 2 | +from flask import json | |
| 3 | 3 | import paramiko |
| 4 | +from sqlalchemy.sql.sqltypes import JSON | |
| 4 | 5 | from .models import MonitorHost, MonitorLog |
| 5 | 6 | import datetime |
| 6 | 7 | import math |
| ... | ... | @@ -10,177 +11,44 @@ import schedule |
| 10 | 11 | from app.util.component.RunContinuous import run_continuously |
| 11 | 12 | from app.util.component.PGUtil import PGUtil |
| 12 | 13 | import configure |
| 14 | +from app.util.component.StructuredPrint import StructurePrint | |
| 15 | +import traceback | |
| 13 | 16 | |
| 14 | 17 | |
| 15 | -def background_job(): | |
| 18 | +def pull_metric(): | |
| 16 | 19 | try: |
| 17 | - # print('Hello from the background thread') | |
| 18 | - # base_dir = os.getcwd() | |
| 19 | - | |
| 20 | - # 命令文件 | |
| 21 | - # cmd_filepath = os.path.join(base_dir, "file", "monitor.txt") | |
| 22 | - # cmd_file = open(cmd_filepath, "r") | |
| 23 | - # cmd = cmd_file.read() | |
| 24 | - # cmd_file.close() | |
| 25 | - # servers = [{'sid': 'src1', 'hostname': '172.26.99.160', | |
| 26 | - # 'username': 'monitor', 'password': '123456'}, | |
| 27 | - # {'sid': 'src2', 'hostname': '172.26.60.100', | |
| 28 | - # 'username': 'root', 'password': 'DMap@123'}] | |
| 29 | - | |
| 30 | - cur_time = datetime.datetime.now() | |
| 31 | - time_stamp = cur_time.strftime( | |
| 32 | - "%Y-%m-%d %H:%M:%S") | |
| 33 | - struct_time = time.strptime(time_stamp, "%Y-%m-%d %H:%M:%S") | |
| 34 | - d_minu_stamp = math.floor(struct_time.tm_min/10) | |
| 35 | - f_minu_stamp = math.floor(struct_time.tm_min/5) | |
| 36 | - | |
| 20 | + # 获获取服务器信息 | |
| 37 | 21 | sys_session = PGUtil.get_db_session( |
| 38 | 22 | configure.SQLALCHEMY_DATABASE_URI) |
| 39 | 23 | sys_ds = PGUtil.open_pg_data_source( |
| 40 | 24 | 0, configure.SQLALCHEMY_DATABASE_URI) |
| 25 | + | |
| 26 | + #拉取服务器信息 | |
| 41 | 27 | |
| 42 | 28 | hosts = sys_session.query( |
| 43 | - MonitorHost.host, MonitorHost.user, MonitorHost.password, MonitorHost.type, MonitorHost.srcid) | |
| 44 | - servers = list(map(lambda host: | |
| 45 | - {'hostname': host.host, 'username': host.user, | |
| 46 | - 'password': host.password, 'type': host.type, | |
| 47 | - 'sid': host.srcid}, | |
| 48 | - hosts)) | |
| 49 | - for info in servers: | |
| 50 | - try: | |
| 51 | - # 业务逻辑 | |
| 52 | - client = paramiko.SSHClient() | |
| 53 | - client.set_missing_host_key_policy(paramiko.AutoAddPolicy) | |
| 54 | - client.connect(hostname=info['hostname'], | |
| 55 | - username=info['username'], password=info['password']) | |
| 56 | - | |
| 57 | - # cpu | |
| 58 | - order = "top -b -n1 | sed -n '3p' | awk '{print $2}'" | |
| 59 | - stdin, stdout, stderr = client.exec_command(order) | |
| 60 | - cpu_usage = stdout.read().decode().split("\n")[0] # cpu使用率 | |
| 61 | - | |
| 62 | - # 内存 | |
| 63 | - order = "free -m | sed -n '2p' | awk '{print $2}'" | |
| 64 | - stdin, stdout, stderr = client.exec_command(order) | |
| 65 | - totalMem = stdout.read().decode().split("\n")[0] # 总内存 | |
| 66 | - | |
| 67 | - order = "free -m | sed -n '2p' | awk '{print $7}'" | |
| 68 | - stdin, stdout, stderr = client.exec_command(order) | |
| 69 | - availableMem = stdout.read().decode().split("\n")[0] # 可用内存 | |
| 70 | - | |
| 71 | - order = "free -m | sed -n '2p' | awk '{print $3}'" | |
| 72 | - stdin, stdout, stderr = client.exec_command(order) | |
| 73 | - usedMem = stdout.read().decode().split("\n")[0] # 已用内存 | |
| 74 | - | |
| 75 | - # disk | |
| 76 | - order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $2}' | awk -v total=0 '{total+=$1}END{print total}'" | |
| 77 | - stdin, stdout, stderr = client.exec_command(order) | |
| 78 | - totalDisk = int(stdout.read().decode().split("\n") | |
| 79 | - [0]) # 总磁盘空间,单位Mb | |
| 80 | - | |
| 81 | - order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $3}' | awk -v total=0 '{total+=$1}END{print total}'" | |
| 82 | - stdin, stdout, stderr = client.exec_command(order) | |
| 83 | - usedDisk = int(stdout.read().decode().split("\n") | |
| 84 | - [0]) # 已使用磁盘空间,单位Mb | |
| 85 | - | |
| 86 | - # network | |
| 87 | - # 接收的字节数 | |
| 88 | - rx_time = [] | |
| 89 | - rx_bytes = [] | |
| 90 | - tx_time = [] | |
| 91 | - tx_bytes = [] | |
| 92 | - | |
| 93 | - # 接收的字节数 | |
| 94 | - order = "ifconfig | grep RX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'" | |
| 95 | - i = 0 | |
| 96 | - while i < 2: | |
| 97 | - i = i+1 | |
| 98 | - stdin, stdout, stderr = client.exec_command(order) | |
| 99 | - rx_time.append(time.time()) | |
| 100 | - rx_bytes.append(int(stdout.read().decode().split("\n")[0])) | |
| 101 | - | |
| 102 | - # 发送的字节数 | |
| 103 | - order = "ifconfig | grep TX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'" | |
| 104 | - i = 0 | |
| 105 | - while i < 2: | |
| 106 | - i = i+1 | |
| 107 | - stdin, stdout, stderr = client.exec_command(order) | |
| 108 | - tx_time.append(time.time()) | |
| 109 | - tx_bytes.append(int(stdout.read().decode().split("\n")[0])) | |
| 110 | - | |
| 111 | - log_guid = uuid.uuid1().__str__() | |
| 112 | - monitor_log = MonitorLog(guid=log_guid, | |
| 113 | - server=info["hostname"], | |
| 114 | - time_stamp=cur_time, | |
| 115 | - cpu_usage=float( | |
| 116 | - "%.2f" % float(cpu_usage)), | |
| 117 | - total_mem=totalMem, | |
| 118 | - available_mem=availableMem, | |
| 119 | - used_mem=usedMem, | |
| 120 | - disk=totalDisk, | |
| 121 | - disk_usage=usedDisk, | |
| 122 | - net_recv=float("%.2f" % float(( | |
| 123 | - rx_bytes[1] - rx_bytes[0])/(rx_time[1]-rx_time[0]))), | |
| 124 | - net_send=float("%.2f" % float(( | |
| 125 | - tx_bytes[1] - tx_bytes[0])/(tx_time[1]-tx_time[0]))), | |
| 126 | - date_stamp=cur_time.strftime( | |
| 127 | - "%Y-%m-%d"), | |
| 128 | - hour_stamp=struct_time.tm_hour, | |
| 129 | - minu_stamp=struct_time.tm_min, | |
| 130 | - d_minu_stamp=1 if d_minu_stamp == 0 else d_minu_stamp, | |
| 131 | - f_minu_stamp=1 if f_minu_stamp == 0 else f_minu_stamp) | |
| 132 | - | |
| 133 | - sys_session.add(monitor_log) | |
| 134 | - sys_session.commit() | |
| 135 | - | |
| 136 | - # for line in stdout: | |
| 137 | - # data = json.loads(line) | |
| 138 | - # # print(type(data)) | |
| 139 | - # print(data) | |
| 140 | - except Exception as e: | |
| 141 | - sys_session.rollback() | |
| 142 | - except e: | |
| 143 | - print('发生了异常:', e) | |
| 144 | - finally: | |
| 145 | - client.close() | |
| 146 | - if sys_session: | |
| 147 | - sys_session.close() | |
| 148 | - if sys_ds: | |
| 149 | - sys_ds.Destroy() | |
| 150 | - | |
| 151 | - | |
| 152 | -# 记录30条记录 | |
| 153 | -logs = [] | |
| 154 | - | |
| 29 | + MonitorHost.host) | |
| 30 | + for host in hosts: | |
| 31 | + request_uri="http://{}".format(host.host) | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + # 获取数据并汇聚为1min的数据入库 | |
| 36 | + # 结束 | |
| 37 | + pass | |
| 38 | + except Exception as e: | |
| 39 | + StructurePrint().print(e.__str__()+":" + traceback.format_exc(), "error") | |
| 40 | + pass | |
| 155 | 41 | |
| 156 | 42 | def start_schedule(): |
| 157 | - # # 1分钟巡检一次 | |
| 158 | - schedule.every(2).minutes.do(background_job) | |
| 159 | - # schedule.every(5).seconds.do(background_job) | |
| 160 | - stop_run_continuously = run_continuously() | |
| 43 | + # # 2分钟巡检一次 | |
| 44 | + try: | |
| 45 | + StructurePrint().print("start_schedule") | |
| 46 | + schedule.every(1).minutes.do(pull_metric) | |
| 47 | + stop_run_continuously = run_continuously() | |
| 48 | + except Exception as e: | |
| 49 | + StructurePrint().print(e.__str__()+":" + traceback.format_exc(), "error") | |
| 50 | + | |
| 161 | 51 | # Do some other things... |
| 162 | 52 | # # Stop the background thread |
| 163 | 53 | # time.sleep(10) |
| 164 | 54 | # stop_run_continuously.set() |
| 165 | - | |
| 166 | - | |
| 167 | -def format_value(value): | |
| 168 | - # 1024*1024*1024 | |
| 169 | - if value > 1_073_741_824: | |
| 170 | - value = "{}GB".format(format(value/1_073_741_824, '.1f')) | |
| 171 | - elif value > 1_048_576: | |
| 172 | - # 1024*1024 | |
| 173 | - value = "{}MB".format(format(value / 1_048_576, '.1f')) | |
| 174 | - elif value > 1024: | |
| 175 | - value = "{}KB".format(format(value / 1024.0, '.1f')) | |
| 176 | - else: | |
| 177 | - value = "{}B".format(format(value, '.1f')) | |
| 178 | - return value | |
| 179 | - | |
| 180 | - | |
| 181 | -def Mb_format_value(value): | |
| 182 | - if value > 1024: | |
| 183 | - value = "{}GB".format(format(value/1024, '.1f')) | |
| 184 | - else: | |
| 185 | - value = "{}MB".format(format(value, '.1f')) | |
| 186 | - return value | ... | ... |
| ... | ... | @@ -4,11 +4,8 @@ import logging |
| 4 | 4 | deploy_ip_host = "172.26.40.105:8840" |
| 5 | 5 | # 系统数据库 |
| 6 | 6 | |
| 7 | - | |
| 8 | 7 | # SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager_test" |
| 9 | -SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager" | |
| 10 | -# SQLALCHEMY_DATABASE_URI = "postgresql://postgres:postgres@localhost:5433/dmap_dms_test" | |
| 11 | - | |
| 8 | +SQLALCHEMY_DATABASE_URI = "postgresql://postgres:postgres@localhost:5433/dmap_dms_test" | |
| 12 | 9 | |
| 13 | 10 | # 指定精华表所在位置(必须为空间库),设置为None则存放在各自的实体库中 |
| 14 | 11 | #VACUATE_DB_URI = None | ... | ... |
| ... | ... | @@ -2,11 +2,9 @@ |
| 2 | 2 | from flask import Flask |
| 3 | 3 | from app import create_app |
| 4 | 4 | import os |
| 5 | -from app.modules.monitor.schedule import start_schedule | |
| 6 | 5 | |
| 7 | 6 | os.environ['AUTHLIB_INSECURE_TRANSPORT'] = '1' |
| 8 | 7 | app: Flask = create_app() |
| 9 | 8 | if __name__ == '__main__': |
| 10 | - # start_schedule() | |
| 11 | 9 | app.run(host="0.0.0.0", port="8840", threaded=True, debug=True) |
| 12 | 10 | # app.run(host="0.0.0.0", port="8840", threaded=True) | ... | ... |
请
注册
或
登录
后发表评论