提交 0da87ccc0bcac83aa2ea98f09ba241f221103fed

作者 nheweijun
1 个父辈 5bde3e49

2021.12.09 剥离影像服务前

@@ -9,6 +9,7 @@ from ..models import Database,db @@ -9,6 +9,7 @@ from ..models import Database,db
9 9
10 from app.util.component.ApiTemplate import ApiTemplate 10 from app.util.component.ApiTemplate import ApiTemplate
11 class Api(ApiTemplate): 11 class Api(ApiTemplate):
  12 +
12 api_name = "测试数据库别名" 13 api_name = "测试数据库别名"
13 14
14 def process(self): 15 def process(self):
@@ -12,7 +12,9 @@ from ..models import Database,DES @@ -12,7 +12,9 @@ from ..models import Database,DES
12 12
13 from app.util.component.ApiTemplate import ApiTemplate 13 from app.util.component.ApiTemplate import ApiTemplate
14 class Api(ApiTemplate): 14 class Api(ApiTemplate):
  15 +
15 api_name = "测试数据库连接" 16 api_name = "测试数据库连接"
  17 +
16 def process(self): 18 def process(self):
17 res = {} 19 res = {}
18 try: 20 try:
@@ -101,6 +101,7 @@ class Api(ApiTemplate): @@ -101,6 +101,7 @@ class Api(ApiTemplate):
101 try: 101 try:
102 task_writer.update_task({"state": -1,"update_time":datetime.datetime.now(),"process": "下载失败"}) 102 task_writer.update_task({"state": -1,"update_time":datetime.datetime.now(),"process": "下载失败"})
103 task_writer.update_process( e.__str__()) 103 task_writer.update_process( e.__str__())
  104 + task_writer.update_process("任务中止!")
104 except Exception as ee: 105 except Exception as ee:
105 StructurePrint().print(ee.__str__()) 106 StructurePrint().print(ee.__str__())
106 raise e 107 raise e
@@ -162,6 +162,8 @@ class Api(ApiTemplate): @@ -162,6 +162,8 @@ class Api(ApiTemplate):
162 for ln in this_task_layer: 162 for ln in this_task_layer:
163 iln = task_writer.session.query(InsertingLayerName).filter_by(name=ln).one_or_none() 163 iln = task_writer.session.query(InsertingLayerName).filter_by(name=ln).one_or_none()
164 task_writer.session.delete(iln) 164 task_writer.session.delete(iln)
  165 + task_writer.update_process(e.__str__())
  166 + task_writer.update_process("任务中止!")
165 StructurePrint().print(e.__str__(), "error") 167 StructurePrint().print(e.__str__(), "error")
166 finally: 168 finally:
167 task_writer.session.commit() 169 task_writer.session.commit()
@@ -160,6 +160,7 @@ class Api(ApiTemplate): @@ -160,6 +160,7 @@ class Api(ApiTemplate):
160 StructurePrint().print(traceback.format_exc()) 160 StructurePrint().print(traceback.format_exc())
161 task_writer.update_task({"state": -1, "update_time": datetime.datetime.now(),"process":"更新失败"}) 161 task_writer.update_task({"state": -1, "update_time": datetime.datetime.now(),"process":"更新失败"})
162 task_writer.update_process(e.__str__()) 162 task_writer.update_process(e.__str__())
  163 + task_writer.update_process("任务中止!")
163 except Exception as ee: 164 except Exception as ee:
164 StructurePrint().print(traceback.format_exc()) 165 StructurePrint().print(traceback.format_exc())
165 finally: 166 finally:
@@ -114,6 +114,7 @@ class Api(ApiTemplate): @@ -114,6 +114,7 @@ class Api(ApiTemplate):
114 114
115 task_writer.update_table(table.guid,{"is_vacuate": 2, "update_time": datetime.datetime.now()}) 115 task_writer.update_table(table.guid,{"is_vacuate": 2, "update_time": datetime.datetime.now()})
116 task_writer.update_task({"state":2,"process":"精华中"}) 116 task_writer.update_task({"state":2,"process":"精华中"})
  117 + task_writer.update_process("开始精化...")
117 118
118 database = task_writer.session.query(Database).filter_by(guid=table.database_guid).one_or_none() 119 database = task_writer.session.query(Database).filter_by(guid=table.database_guid).one_or_none()
119 database_sqlalchemy_uri = str(database.sqlalchemy_uri) 120 database_sqlalchemy_uri = str(database.sqlalchemy_uri)
@@ -168,13 +169,14 @@ class Api(ApiTemplate): @@ -168,13 +169,14 @@ class Api(ApiTemplate):
168 169
169 task_writer.update_task({"state":1,"update_time":datetime.datetime.now(),"process": "精化完成"}) 170 task_writer.update_task({"state":1,"update_time":datetime.datetime.now(),"process": "精化完成"})
170 task_writer.update_table(table.guid, {"is_vacuate": 1, "update_time": datetime.datetime.now()}) 171 task_writer.update_table(table.guid, {"is_vacuate": 1, "update_time": datetime.datetime.now()})
  172 + task_writer.update_process("精化完成!")
171 173
172 except Exception as e: 174 except Exception as e:
173 try: 175 try:
174 task_writer.update_task({"state": -1,"update_time":datetime.datetime.now(),"process": "精化失败"}) 176 task_writer.update_task({"state": -1,"update_time":datetime.datetime.now(),"process": "精化失败"})
175 task_writer.update_table(table.guid, {"is_vacuate": 0, "update_time": datetime.datetime.now()}) 177 task_writer.update_table(table.guid, {"is_vacuate": 0, "update_time": datetime.datetime.now()})
176 task_writer.update_process( e.__str__()) 178 task_writer.update_process( e.__str__())
177 - 179 + task_writer.update_process("任务中止!")
178 task_writer.session.commit() 180 task_writer.session.commit()
179 181
180 if vacuate_process: 182 if vacuate_process:
@@ -100,7 +100,7 @@ class Api(ApiTemplate): @@ -100,7 +100,7 @@ class Api(ApiTemplate):
100 100
101 def task(self,table,task_guid,grids): 101 def task(self,table,task_guid,grids):
102 102
103 - task_write = None 103 + task_writer = None
104 pg_session = None 104 pg_session = None
105 pg_ds = None 105 pg_ds = None
106 vacuate_process = None 106 vacuate_process = None
@@ -110,22 +110,23 @@ class Api(ApiTemplate): @@ -110,22 +110,23 @@ class Api(ApiTemplate):
110 110
111 #任务控制,等待执行 111 #任务控制,等待执行
112 TaskController.wait(task_guid) 112 TaskController.wait(task_guid)
113 - task_write = TaskWriter(task_guid) 113 + task_writer = TaskWriter(task_guid)
114 114
115 - task_write.update_table(table.guid,{"is_vacuate": 2, "update_time": datetime.datetime.now()})  
116 - task_write.update_task({"state":2,"process":"精华中"}) 115 + task_writer.update_table(table.guid,{"is_vacuate": 2, "update_time": datetime.datetime.now()})
  116 + task_writer.update_task({"state":2,"process":"精华中"})
  117 + task_writer.update_process("开始精化...")
117 118
118 - database = task_write.session.query(Database).filter_by(guid=table.database_guid).one_or_none() 119 + database = task_writer.session.query(Database).filter_by(guid=table.database_guid).one_or_none()
119 database_sqlalchemy_uri = str(database.sqlalchemy_uri) 120 database_sqlalchemy_uri = str(database.sqlalchemy_uri)
120 pg_session = PGUtil.get_db_session(DES.decode(database_sqlalchemy_uri)) 121 pg_session = PGUtil.get_db_session(DES.decode(database_sqlalchemy_uri))
121 pg_ds :DataSource= PGUtil.open_pg_data_source(1,DES.decode(database_sqlalchemy_uri)) 122 pg_ds :DataSource= PGUtil.open_pg_data_source(1,DES.decode(database_sqlalchemy_uri))
122 123
123 #删除原有数据 124 #删除原有数据
124 for grid in grids: 125 for grid in grids:
125 - tvs = task_write.session.query(TableVacuate).filter_by(pixel_distance=grid,table_guid=table.guid).all() 126 + tvs = task_writer.session.query(TableVacuate).filter_by(pixel_distance=grid,table_guid=table.guid).all()
126 for tv in tvs : 127 for tv in tvs :
127 - task_write.session.delete(tv)  
128 - task_write.session.commit() 128 + task_writer.session.delete(tv)
  129 + task_writer.session.commit()
129 130
130 131
131 # 创建抽稀过程 132 # 创建抽稀过程
@@ -166,16 +167,17 @@ class Api(ApiTemplate): @@ -166,16 +167,17 @@ class Api(ApiTemplate):
166 name=layer_name, 167 name=layer_name,
167 pixel_distance=vacuate_process.this_gridsize[l], 168 pixel_distance=vacuate_process.this_gridsize[l],
168 connectstr=DES.encode(connectstr)) 169 connectstr=DES.encode(connectstr))
169 - task_write.session.add(table_vacuate)  
170 - task_write.update_task({"state":1,"update_time":datetime.datetime.now(),"process" : "精化完成"})  
171 - task_write.update_table(table.guid,{"is_vacuate": 1, "update_time": datetime.datetime.now()})  
172 - 170 + task_writer.session.add(table_vacuate)
  171 + task_writer.update_task({"state":1,"update_time":datetime.datetime.now(),"process" : "精化完成"})
  172 + task_writer.update_table(table.guid,{"is_vacuate": 1, "update_time": datetime.datetime.now()})
  173 + task_writer.update_process("精化完成!")
173 174
174 except Exception as e: 175 except Exception as e:
175 try: 176 try:
176 - task_write.update_task({"state": -1,"update_time":datetime.datetime.now(),"process": "精化失败"})  
177 - task_write.update_table(table.guid, {"is_vacuate": origin_vacuate, "update_time": datetime.datetime.now()})  
178 - task_write.update_process( e.__str__()) 177 + task_writer.update_task({"state": -1,"update_time":datetime.datetime.now(),"process": "精化失败"})
  178 + task_writer.update_table(table.guid, {"is_vacuate": origin_vacuate, "update_time": datetime.datetime.now()})
  179 + task_writer.update_process( e.__str__())
  180 + task_writer.update_process("任务中止!")
179 if vacuate_process: 181 if vacuate_process:
180 vacuate_process.rollback() 182 vacuate_process.rollback()
181 print(traceback.format_exc()) 183 print(traceback.format_exc())
@@ -183,7 +185,7 @@ class Api(ApiTemplate): @@ -183,7 +185,7 @@ class Api(ApiTemplate):
183 print(traceback.format_exc()) 185 print(traceback.format_exc())
184 finally: 186 finally:
185 try: 187 try:
186 - task_write.close() 188 + task_writer.close()
187 if vacuate_process: 189 if vacuate_process:
188 vacuate_process.end() 190 vacuate_process.end()
189 if pg_session: 191 if pg_session:
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 #createtime: 2020/9/4 3 #createtime: 2020/9/4
4 #email: nheweijun@sina.com 4 #email: nheweijun@sina.com
5 5
6 -from ..models import db,Task,Table,InsertingLayerName 6 +from ..models import db,Task,Table,InsertingLayerName,Process
7 7
8 from app.modules.service.models import Image 8 from app.modules.service.models import Image
9 from app.util.component.ApiTemplate import ApiTemplate 9 from app.util.component.ApiTemplate import ApiTemplate
@@ -12,7 +12,8 @@ import os @@ -12,7 +12,8 @@ import os
12 import signal 12 import signal
13 import platform 13 import platform
14 import json 14 import json
15 - 15 +import datetime
  16 +import uuid
16 class Api(ApiTemplate): 17 class Api(ApiTemplate):
17 api_name = "停止任务" 18 api_name = "停止任务"
18 def para_check(self): 19 def para_check(self):
@@ -37,6 +38,7 @@ class Api(ApiTemplate): @@ -37,6 +38,7 @@ class Api(ApiTemplate):
37 38
38 #处理kill任务后的事情 39 #处理kill任务后的事情
39 self.fix_task(task) 40 self.fix_task(task)
  41 +
40 res["msg"] = "Kill成功!" 42 res["msg"] = "Kill成功!"
41 res["result"] = True 43 res["result"] = True
42 except Exception as e: 44 except Exception as e:
@@ -67,6 +69,12 @@ class Api(ApiTemplate): @@ -67,6 +69,12 @@ class Api(ApiTemplate):
67 Image.query.filter_by(guid=task.parameter).update({"has_pyramid":0}) 69 Image.query.filter_by(guid=task.parameter).update({"has_pyramid":0})
68 70
69 Task.query.filter_by(guid=task.guid).update({"state":-1}) 71 Task.query.filter_by(guid=task.guid).update({"state":-1})
  72 +
  73 + message = "{} 任务被强行中止!".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
  74 + task_process = Process(guid=uuid.uuid1().__str__(), message=message, time=datetime.datetime.now(),
  75 + task_guid=task.guid)
  76 +
  77 + db.add(task_process)
70 db.session.commit() 78 db.session.commit()
71 return None 79 return None
72 80
@@ -86,7 +86,9 @@ class EntryDataVacuate: @@ -86,7 +86,9 @@ class EntryDataVacuate:
86 this_task.rollback() 86 this_task.rollback()
87 87
88 except Exception as e: 88 except Exception as e:
89 - this_task.write_process("{} 任务结束!".format(e.__str__())) 89 + this_task.write_process(e.__str__())
  90 + this_task.write_process("任务中止!")
  91 +
90 this_task.update({"state": -1, "process": "入库失败", "update_time": datetime.datetime.now()}) 92 this_task.update({"state": -1, "process": "入库失败", "update_time": datetime.datetime.now()})
91 StructurePrint().print(e.__str__(),"ERROR") 93 StructurePrint().print(e.__str__(),"ERROR")
92 # rollback 94 # rollback
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 5
6 6
7 from app.util.component.ApiTemplate import ApiTemplate 7 from app.util.component.ApiTemplate import ApiTemplate
8 -from ..models import Service,ImageService,Image,db,ServiceFunction 8 +from ..models import Service,ImageService,Image,db,ServiceFunction,TileScheme
9 import datetime 9 import datetime
10 import json 10 import json
11 import configure 11 import configure
@@ -44,6 +44,11 @@ class Api(ApiTemplate): @@ -44,6 +44,11 @@ class Api(ApiTemplate):
44 if key in ["name","scheme_guid"]: 44 if key in ["name","scheme_guid"]:
45 image_update[key] = self.para.get(key) 45 image_update[key] = self.para.get(key)
46 46
  47 + #修改切片方案的处理
  48 + if self.para.get("scheme_guid"):
  49 + tilesche = TileScheme.query.filter_by(guid=self.para.get("scheme_guid")).one_or_none()
  50 + image_update["scheme"] = json.dumps(ModelVisitor.object_to_json(tilesche))
  51 +
47 image_service = ImageService.query.filter_by(service_guid=guid) 52 image_service = ImageService.query.filter_by(service_guid=guid)
48 53
49 # 修改功能 54 # 修改功能
@@ -4,8 +4,9 @@ @@ -4,8 +4,9 @@
4 #email: nheweijun@sina.com 4 #email: nheweijun@sina.com
5 5
6 6
7 -from ..models import db,Service,ImageService,Image,ServiceFunction 7 +from ..models import db,Service,ImageService,Image,ServiceFunction,TileScheme
8 from app.util.component.ApiTemplate import ApiTemplate 8 from app.util.component.ApiTemplate import ApiTemplate
  9 +from app.util.component.ModelVisitor import ModelVisitor
9 import uuid 10 import uuid
10 11
11 import os 12 import os
@@ -57,10 +58,13 @@ class Api(ApiTemplate): @@ -57,10 +58,13 @@ class Api(ApiTemplate):
57 58
58 db.session.add(service) 59 db.session.add(service)
59 60
  61 + tile_scheme = TileScheme.query.filter_by(guid=self.para.get("scheme_guid")).one_or_none()
  62 +
60 image_service = ImageService(guid=image_service_guid, 63 image_service = ImageService(guid=image_service_guid,
61 name=name, 64 name=name,
62 create_time=this_time, 65 create_time=this_time,
63 scheme_guid=self.para.get("scheme_guid"), 66 scheme_guid=self.para.get("scheme_guid"),
  67 + scheme = json.dumps(ModelVisitor.object_to_json(tile_scheme)),
64 crs = Image.query.filter_by(guid=guids[0]).one_or_none().crs, 68 crs = Image.query.filter_by(guid=guids[0]).one_or_none().crs,
65 service_guid=service_guid 69 service_guid=service_guid
66 ) 70 )
@@ -36,21 +36,21 @@ class Cache: @@ -36,21 +36,21 @@ class Cache:
36 pass 36 pass
37 37
38 # 更新zoo 38 # 更新zoo
39 - if not GLOBAL_DIC.get("zookeeper_updatetime"):  
40 - GLOBAL_DIC["zookeeper_updatetime"] = time.time()  
41 - if time.time() - GLOBAL_DIC["zookeeper_updatetime"] > 15:  
42 - #释放,高并发下可行吗,线程安全问题  
43 - try:  
44 - zoo.stop()  
45 - zoo.close()  
46 - del zoo  
47 - except Exception as e:  
48 - StructurePrint().print("关闭zoo失败")  
49 - StructurePrint().print(e.__str__())  
50 - zoo: KazooClient = KazooClient(hosts=configure.zookeeper, timeout=1)  
51 - zoo.start()  
52 - GLOBAL_DIC["zookeeper"] = zoo  
53 - GLOBAL_DIC["zookeeper_updatetime"] = time.time() 39 + # if not GLOBAL_DIC.get("zookeeper_updatetime"):
  40 + # GLOBAL_DIC["zookeeper_updatetime"] = time.time()
  41 + # if time.time() - GLOBAL_DIC["zookeeper_updatetime"] > 15:
  42 + # #释放,高并发下可行吗,线程安全问题,别人正在用,关闭不了
  43 + # try:
  44 + # # zoo.stop()
  45 + # # zoo.close()
  46 + # del zoo
  47 + # except Exception as e:
  48 + # StructurePrint().print("关闭zoo失败")
  49 + # StructurePrint().print(e.__str__())
  50 + # zoo: KazooClient = KazooClient(hosts=configure.zookeeper, timeout=1)
  51 + # zoo.start()
  52 + # GLOBAL_DIC["zookeeper"] = zoo
  53 + # GLOBAL_DIC["zookeeper_updatetime"] = time.time()
54 54
55 # 缓存数据服务器 55 # 缓存数据服务器
56 servers = GLOBAL_DIC.get("servers") 56 servers = GLOBAL_DIC.get("servers")
@@ -87,6 +87,11 @@ class Cache: @@ -87,6 +87,11 @@ class Cache:
87 GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service), 87 GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service),
88 "images": ModelVisitor.objects_to_jsonarray(images), 88 "images": ModelVisitor.objects_to_jsonarray(images),
89 "scheme": json.loads(scheme.parameter)} 89 "scheme": json.loads(scheme.parameter)}
  90 +
  91 +
  92 + # GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service),
  93 + # "images": ModelVisitor.objects_to_jsonarray(images),
  94 + # "scheme": json.loads(json.loads(image_service.scheme).get("parameter"))}
90 else: 95 else:
91 96
92 GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service), 97 GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service),
@@ -25,12 +25,8 @@ class Api(ApiTemplate): @@ -25,12 +25,8 @@ class Api(ApiTemplate):
25 service_function_guid = uuid.uuid1().__str__() 25 service_function_guid = uuid.uuid1().__str__()
26 26
27 27
28 -  
29 # 逻辑是,先调用引擎接口,引擎说可以,才做持久化 28 # 逻辑是,先调用引擎接口,引擎说可以,才做持久化
30 -  
31 -  
32 -  
33 - 29 + # 并获得服务缩略图
34 30
35 service = Service( 31 service = Service(
36 guid = service_guid, 32 guid = service_guid,
@@ -24,6 +24,8 @@ class Api(ApiTemplate): @@ -24,6 +24,8 @@ class Api(ApiTemplate):
24 dir_path, store_file = FileProcess.save(parent) 24 dir_path, store_file = FileProcess.save(parent)
25 25
26 26
  27 +
  28 +
27 except Exception as e: 29 except Exception as e:
28 raise e 30 raise e
29 return res 31 return res
@@ -15,10 +15,13 @@ class Api(ApiTemplate): @@ -15,10 +15,13 @@ class Api(ApiTemplate):
15 try: 15 try:
16 guid = self.para.get("guid") 16 guid = self.para.get("guid")
17 state = int(self.para.get("state")) 17 state = int(self.para.get("state"))
18 - Service.query.filter_by(guid=guid).update({"state":state})  
19 -  
20 # 清理缓存,拒绝服务 18 # 清理缓存,拒绝服务
21 19
  20 + service = Service.query.filter_by(guid=guid).one_or_none()
  21 +
  22 +
  23 +
  24 + service.state=state
22 db.session.commit() 25 db.session.commit()
23 res["result"] = True 26 res["result"] = True
24 except Exception as e: 27 except Exception as e:
@@ -6,11 +6,11 @@ @@ -6,11 +6,11 @@
6 from app.util.component.ApiTemplate import ApiTemplate 6 from app.util.component.ApiTemplate import ApiTemplate
7 from app.util.component.ModelVisitor import ModelVisitor 7 from app.util.component.ModelVisitor import ModelVisitor
8 import uuid 8 import uuid
9 -from ..models import TileService,Service,db,ServiceFunction 9 +from ..models import TileService,Service,db,ServiceFunction,TileScheme
10 import datetime 10 import datetime
11 import requests 11 import requests
12 from .util.ProjectFile import ProjectFile 12 from .util.ProjectFile import ProjectFile
13 - 13 +import json
14 from requests import Response 14 from requests import Response
15 import configure 15 import configure
16 class Api(ApiTemplate): 16 class Api(ApiTemplate):
@@ -33,6 +33,9 @@ class Api(ApiTemplate): @@ -33,6 +33,9 @@ class Api(ApiTemplate):
33 "layer_name","layer_alias","layer_title","layer_style","layer_format", 33 "layer_name","layer_alias","layer_title","layer_style","layer_format",
34 "layer_extent","layer_description","scheme_guid"]: 34 "layer_extent","layer_description","scheme_guid"]:
35 tile_update[key] = self.para.get(key) 35 tile_update[key] = self.para.get(key)
  36 + if self.para.get("scheme_guid"):
  37 + tilesche = TileScheme.query.filter_by(guid=self.para.get("scheme_guid")).one_or_none()
  38 + tile_update["scheme"] = json.dumps(ModelVisitor.object_to_json(tilesche))
36 39
37 #通知tileserver,更新缓存 40 #通知tileserver,更新缓存
38 ts = TileService.query.filter_by(service_guid=guid).one_or_none() 41 ts = TileService.query.filter_by(service_guid=guid).one_or_none()
@@ -13,7 +13,7 @@ import datetime @@ -13,7 +13,7 @@ import datetime
13 import configure 13 import configure
14 import requests 14 import requests
15 from requests import Response 15 from requests import Response
16 - 16 +import json
17 from .util.ProjectFile import ProjectFile 17 from .util.ProjectFile import ProjectFile
18 18
19 class Api(ApiTemplate): 19 class Api(ApiTemplate):
@@ -79,7 +79,7 @@ class Api(ApiTemplate): @@ -79,7 +79,7 @@ class Api(ApiTemplate):
79 layer_extent = self.para.get("layer_extent"), 79 layer_extent = self.para.get("layer_extent"),
80 layer_description = self.para.get("layer_description"), 80 layer_description = self.para.get("layer_description"),
81 scheme_guid = self.para.get("scheme_guid"), 81 scheme_guid = self.para.get("scheme_guid"),
82 - scheme = ModelVisitor.object_to_json(tile_scheme), 82 + scheme = json.dumps(ModelVisitor.object_to_json(tile_scheme)),
83 service_guid = service_guid, 83 service_guid = service_guid,
84 metadata_url = "{}/DMap/Services/{}/MapServer/WMTSServer".format(configure.wmts_url,self.para.get("name")) 84 metadata_url = "{}/DMap/Services/{}/MapServer/WMTSServer".format(configure.wmts_url,self.para.get("name"))
85 ) 85 )
@@ -11,6 +11,7 @@ from app.util.component.ModelVisitor import ModelVisitor @@ -11,6 +11,7 @@ from app.util.component.ModelVisitor import ModelVisitor
11 11
12 from .util.ProjectFile import ProjectFile 12 from .util.ProjectFile import ProjectFile
13 13
  14 +
14 class Api(ApiTemplate): 15 class Api(ApiTemplate):
15 16
16 api_name = "切片服务reload" 17 api_name = "切片服务reload"
@@ -33,6 +34,8 @@ class Api(ApiTemplate): @@ -33,6 +34,8 @@ class Api(ApiTemplate):
33 raise e 34 raise e
34 return res 35 return res
35 36
  37 +
  38 +
36 api_doc = { 39 api_doc = {
37 "tags": ["切片服务接口"], 40 "tags": ["切片服务接口"],
38 "parameters": [ 41 "parameters": [
@@ -24,62 +24,66 @@ class ProjectFile: @@ -24,62 +24,66 @@ class ProjectFile:
24 raise Exception("切片方案不存在!") 24 raise Exception("切片方案不存在!")
25 tile_scheme = ModelVisitor.object_to_json(tile_scheme) 25 tile_scheme = ModelVisitor.object_to_json(tile_scheme)
26 26
27 - project_xml_format = '''<?xml version="1.0"?>  
28 - <dmap projectname="wmtstest" version="4.0">  
29 - <projectCrs>  
30 - <spatialrefsys>  
31 - <wkt>{wkt}</wkt>  
32 - <proj4>{proj4}</proj4>  
33 - <srid>{srid}</srid>  
34 - <description/>  
35 - <projectionacronym/>  
36 - </spatialrefsys>  
37 - </projectCrs>  
38 - <projectlayers>  
39 - <maplayer name="{name}" alias="{alias}" type="0">  
40 - <extent>  
41 - <xmin>{xmin}</xmin>  
42 - <ymin>{xmax}</ymin>  
43 - <xmax>{xmax}</xmax>  
44 - <ymax>{ymax}</ymax>  
45 - </extent>  
46 - <style>{layer_style}</style>  
47 - <format>{layer_format}</format>  
48 - <vendor>{vendor}</vendor>  
49 - <datasource>{datasource}</datasource>  
50 - <tileMatrixSets>  
51 - <tileMatrixSet>  
52 - <id>default</id>  
53 - <crs>{crs}</crs>  
54 - <tileCols>{cols}</tileCols>  
55 - <tileRows>{rows}</tileRows>  
56 - <dpi>{dpi}</dpi>  
57 - <tileOrigin>  
58 - <X>{x}</X>  
59 - <Y>{y}</Y>  
60 - </tileOrigin>  
61 - <levels>  
62 - {levels}  
63 - </levels>  
64 - </tileMatrixSet>  
65 - </tileMatrixSets>  
66 - </maplayer>  
67 - </projectlayers>  
68 - </dmap>  
69 - ''' 27 + project_xml_format = '''
  28 +<?xml version="1.0"?>
  29 +<dmap projectname="wmtstest" version="4.0">
  30 + <projectCrs>
  31 + <spatialrefsys>
  32 + <wkt>{wkt}</wkt>
  33 + <proj4>{proj4}</proj4>
  34 + <srid>{srid}</srid>
  35 + <description/>
  36 + <projectionacronym/>
  37 + </spatialrefsys>
  38 + </projectCrs>
  39 + <projectlayers>
  40 + <maplayer name="{name}" alias="{alias}" type="0">
  41 + <extent>
  42 + <xmin>{xmin}</xmin>
  43 + <ymin>{xmax}</ymin>
  44 + <xmax>{xmax}</xmax>
  45 + <ymax>{ymax}</ymax>
  46 + </extent>
  47 + <style>{layer_style}</style>
  48 + <format>{layer_format}</format>
  49 + <vendor>{vendor}</vendor>
  50 + <datasource>{datasource}</datasource>
  51 + <tileMatrixSets>
  52 + <tileMatrixSet>
  53 + <id>default</id>
  54 + <crs>{crs}</crs>
  55 + <tileCols>{cols}</tileCols>
  56 + <tileRows>{rows}</tileRows>
  57 + <dpi>{dpi}</dpi>
  58 + <tileOrigin>
  59 + <X>{x}</X>
  60 + <Y>{y}</Y>
  61 + </tileOrigin>
  62 + <levels>
  63 + {levels}
  64 + </levels>
  65 + </tileMatrixSet>
  66 + </tileMatrixSets>
  67 + </maplayer>
  68 + </projectlayers>
  69 +</dmap>
  70 +'''
70 71
71 level_each = '''<level> 72 level_each = '''<level>
72 - <id>{lev}</id>  
73 - <scaleDenominator>{scale}</scaleDenominator>  
74 - <resolution>{resolution}</resolution>  
75 - </level>''' 73 + <id>{lev}</id>
  74 + <scaleDenominator>{scale}</scaleDenominator>
  75 + <resolution>{resolution}</resolution>
  76 + </level>
  77 + '''
76 78
77 - levels = "" 79 + levels = ''
78 for level in json.loads(tile_scheme.get("levels")): 80 for level in json.loads(tile_scheme.get("levels")):
79 levels = "{}{}".format(levels, level_each.format(lev=level["level"], 81 levels = "{}{}".format(levels, level_each.format(lev=level["level"],
80 scale=level["scale"], 82 scale=level["scale"],
81 resolution=level["resolution"], 83 resolution=level["resolution"],
82 )) 84 ))
  85 + #删除空格
  86 + levels = levels.strip()
83 87
84 layer_extent = para.get("layer_extent").split(",") 88 layer_extent = para.get("layer_extent").split(",")
85 89
@@ -87,7 +91,7 @@ class ProjectFile: @@ -87,7 +91,7 @@ class ProjectFile:
87 proj4="", 91 proj4="",
88 srid=para.get("crs").split("::")[-1], 92 srid=para.get("crs").split("::")[-1],
89 name=para.get("layer_name"), 93 name=para.get("layer_name"),
90 - alias=para.get("alias"), 94 + alias=para.get("alias") if para.get("alias") else "",
91 xmin=layer_extent[0], 95 xmin=layer_extent[0],
92 xmax=layer_extent[1], 96 xmax=layer_extent[1],
93 ymin=layer_extent[2], 97 ymin=layer_extent[2],
@@ -106,40 +110,40 @@ class ProjectFile: @@ -106,40 +110,40 @@ class ProjectFile:
106 ) 110 )
107 else: 111 else:
108 112
109 - project_xml_format = '''<?xml version="1.0"?>  
110 - <dmap projectname="tmstest" version="4.0">  
111 - <projectCrs>  
112 - <spatialrefsys>  
113 - <wkt>{wkt}</wkt>  
114 - <proj4>{proj4}</proj4>  
115 - <srid>{srid}</srid>  
116 - <description/>  
117 - <projectionacronym/>  
118 - </spatialrefsys>  
119 - </projectCrs>  
120 - <projectlayers>  
121 - <maplayer name="{name}" alias="{alias}" type="3">  
122 - <extent>  
123 - <xmin>{xmin}</xmin>  
124 - <ymin>{xmax}</ymin>  
125 - <xmax>{xmax}</xmax>  
126 - <ymax>{ymax}</ymax>  
127 - </extent>  
128 - <style>{layer_style}</style>  
129 - <format>{layer_format}</format>  
130 - <vendor>{vendor}</vendor>  
131 - <datasource>{datasource}</datasource>  
132 - </maplayer>  
133 - </projectlayers>  
134 - </dmap>  
135 -  
136 - ''' 113 + project_xml_format = '''
  114 +<?xml version="1.0"?>
  115 +<dmap projectname="tmstest" version="4.0">
  116 + <projectCrs>
  117 + <spatialrefsys>
  118 + <wkt>{wkt}</wkt>
  119 + <proj4>{proj4}</proj4>
  120 + <srid>{srid}</srid>
  121 + <description/>
  122 + <projectionacronym/>
  123 + </spatialrefsys>
  124 + </projectCrs>
  125 + <projectlayers>
  126 + <maplayer name="{name}" alias="{alias}" type="3">
  127 + <extent>
  128 + <xmin>{xmin}</xmin>
  129 + <ymin>{xmax}</ymin>
  130 + <xmax>{xmax}</xmax>
  131 + <ymax>{ymax}</ymax>
  132 + </extent>
  133 + <style>{layer_style}</style>
  134 + <format>{layer_format}</format>
  135 + <vendor>{vendor}</vendor>
  136 + <datasource>{datasource}</datasource>
  137 + </maplayer>
  138 + </projectlayers>
  139 +</dmap>
  140 +'''
137 layer_extent = para.get("layer_extent").split(",") 141 layer_extent = para.get("layer_extent").split(",")
138 project_xml = project_xml_format.format(wkt="", 142 project_xml = project_xml_format.format(wkt="",
139 proj4="", 143 proj4="",
140 srid=para.get("crs").split("::")[-1], 144 srid=para.get("crs").split("::")[-1],
141 name=para.get("layer_name"), 145 name=para.get("layer_name"),
142 - alias=para.get("alias"), 146 + alias=para.get("alias") if para.get("alias") else "",
143 xmin=layer_extent[0], 147 xmin=layer_extent[0],
144 xmax=layer_extent[1], 148 xmax=layer_extent[1],
145 ymin=layer_extent[2], 149 ymin=layer_extent[2],
@@ -149,4 +153,6 @@ class ProjectFile: @@ -149,4 +153,6 @@ class ProjectFile:
149 vendor=para.get("vendor"), 153 vendor=para.get("vendor"),
150 datasource=para.get("datasource"), 154 datasource=para.get("datasource"),
151 ) 155 )
  156 +
  157 + project_xml = project_xml.strip()
152 return str(base64.b64encode(project_xml.encode('utf-8')), encoding="utf8") 158 return str(base64.b64encode(project_xml.encode('utf-8')), encoding="utf8")
@@ -20,6 +20,8 @@ import time @@ -20,6 +20,8 @@ import time
20 # sql ="SELECT geom FROM {} WHERE geom && 'BOX3D({})'::box3d limit 100000".format(table,bbox) 20 # sql ="SELECT geom FROM {} WHERE geom && 'BOX3D({})'::box3d limit 100000".format(table,bbox)
21 21
22 import base64 22 import base64
  23 +
  24 +from kazoo.client import KazooClient
23 def query_thread(): 25 def query_thread():
24 def get_db_session(db_url, autocommit=False) -> Session: 26 def get_db_session(db_url, autocommit=False) -> Session:
25 engine = create_engine(db_url, pool_size=100) 27 engine = create_engine(db_url, pool_size=100)
@@ -53,6 +55,16 @@ def query_thread(): @@ -53,6 +55,16 @@ def query_thread():
53 ses.close() 55 ses.close()
54 # query_thread() 56 # query_thread()
55 if __name__ == '__main__': 57 if __name__ == '__main__':
56 - kk="PD94bWwgdmVyc2lvbj0iMS4wIj8+CiAgICAgICAgICAgIDxkbWFwIHByb2plY3RuYW1lPSJ3bXRzdGVzdCIgdmVyc2lvbj0iNC4wIj4KICAgICAgICAgICAgICA8cHJvamVjdENycz4KICAgICAgICAgICAgICAgIDxzcGF0aWFscmVmc3lzPgogICAgICAgICAgICAgICAgICA8d2t0Pjwvd2t0PgogICAgICAgICAgICAgICAgICA8cHJvajQ+PC9wcm9qND4KICAgICAgICAgICAgICAgICAgPHNyaWQ+NDQ5MDwvc3JpZD4KICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uLz4KICAgICAgICAgICAgICAgICAgPHByb2plY3Rpb25hY3JvbnltLz4KICAgICAgICAgICAgICAgIDwvc3BhdGlhbHJlZnN5cz4KICAgICAgICAgICAgICA8L3Byb2plY3RDcnM+CiAgICAgICAgICAgICAgPHByb2plY3RsYXllcnM+CiAgICAgICAgICAgICAgICA8bWFwbGF5ZXIgbmFtZT0ibGF5ZXIiIGFsaWFzPSJOb25lIiB0eXBlPSIwIj4KICAgICAgICAgICAgICAgICAgPGV4dGVudD4KICAgICAgICAgICAgICAgICAgICA8eG1pbj4xMDcuNzg5ODE0OTQxODA2MTg8L3htaW4+CiAgICAgICAgICAgICAgICAgICAgPHltaW4+MTIwLjQzNTUzNjAzOTM1Njc1PC95bWluPgogICAgICAgICAgICAgICAgICAgIDx4bWF4PjEyMC40MzU1MzYwMzkzNTY3NTwveG1heD4KICAgICAgICAgICAgICAgICAgICA8eW1heD4yNS45OTk4Njg3NTc3MzcwMzM8L3ltYXg+CiAgICAgICAgICAgICAgICAgIDwvZXh0ZW50PgogICAgICAgICAgICAgICAgICA8c3R5bGU+ZGVmYXVsdDwvc3R5bGU+CiAgICAgICAgICAgICAgICAgIDxmb3JtYXQ+aW1hZ2UvcG5nPC9mb3JtYXQ+CiAgICAgICAgICAgICAgICAgIDx2ZW5kb3I+RVNSSV9WMTwvdmVuZG9yPgogICAgICAgICAgICAgICAgICA8ZGF0YXNvdXJjZT4vdXNyL2xvY2FsL2RtYXA0L2dkbWFwL19hbGxsYXllcnM8L2RhdGFzb3VyY2U+CiAgICAgICAgICAgICAgICAgIDx0aWxlTWF0cml4U2V0cz4KICAgICAgICAgICAgICAgICAgICA8dGlsZU1hdHJpeFNldD4KICAgICAgICAgICAgICAgICAgICAgIDxpZD5kZWZhdWx0PC9pZD4KICAgICAgICAgICAgICAgICAgICAgIDxjcnM+RVBTRzo6NDQ5MDwvY3JzPgogICAgICAgICAgICAgICAgICAgICAgPHRpbGVDb2xzPjI1NjwvdGlsZUNvbHM+CiAgICAgICAgICAgICAgICAgICAgICA8dGlsZVJvd3M+MjU2PC90aWxlUm93cz4KICAgICAgICAgICAgICAgICAgICAgIDxkcGk+OTY8L2RwaT4KICAgICAgICAgICAgICAgICAgICAgIDx0aWxlT3JpZ2luPgogICAgICAgICAgICAgICAgICAgICAgICA8WD40MDA8L1g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxZPi00MDA8L1k+CiAgICAgICAgICAgICAgICAgICAgICA8L3RpbGVPcmlnaW4+CiAgICAgICAgICAgICAgICAgICAgICA8bGV2ZWxzPgogICAgICAgICAgICAgICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD4wPC9pZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+NTkwOTk1MTg2LjEyPC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4xLjQwNjI1MDAwMDAwNTk0ODg8L3Jlc29sdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGV2ZWw+PGxldmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aWQ+MTwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjI5NTQ5NzU5My4wNjwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC43MDMxMjUwMDAwMDI5NzQ0PC9yZXNvbHV0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xldmVsPjxsZXZlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlkPjI8L2lkPgogICAgICAgICAgICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4xNDc3NDg3OTYuNTM8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMzUxNTYyNTAwMDAxNDg3MjwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD4zPC9pZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+NzM4NzQzOTguMjY1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4wLjE3NTc4MTI1MDAwMDc0MzY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGV2ZWw+PGxldmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aWQ+NDwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjM2OTM3MTk5LjEzMjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDg3ODkwNjI1MDAwMzcxODwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD41PC9pZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MTg0Njg1OTkuNTY2MjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDQzOTQ1MzEyNTAwMTg1OTwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD42PC9pZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+OTIzNDI5OS43ODMxMjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDIxOTcyNjU2MjUwMDkyOTU8L3Jlc29sdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGV2ZWw+PGxldmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aWQ+NzwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjQ2MTcxNDkuODkxNTYyNTwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMTA5ODYzMjgxMjUwNDY0NzU8L3Jlc29sdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGV2ZWw+PGxldmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ODwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjIzMDg1NzQuOTQ1NzgxMjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDA1NDkzMTY0MDYyNTIzMjM3NTwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD45PC9pZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MTE1NDI4Ny40NzI4OTA2MjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDAyNzQ2NTgyMDMxMjYxNjE4NzwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD4xMDwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjU3NzE0My43MzY0NDUzMTI1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4wLjAwMTM3MzI5MTAxNTYzMDgwOTQ8L3Jlc29sdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGV2ZWw+PGxldmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aWQ+MTE8L2lkPgogICAgICAgICAgICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4yODg1NzEuODY4MjIyNjU2MjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDAwNjg2NjQ1NTA3ODE1NDA0NzwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD4xMjwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjE0NDI4NS45MzQxMTEzMjgxMzwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDAzNDMzMjI3NTM5MDc3MDIzNDwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD4xMzwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjcyMTQyLjk2NzA1NTY2NDA2PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4wLjAwMDE3MTY2MTM3Njk1Mzg1MTE3PC9yZXNvbHV0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xldmVsPjxsZXZlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlkPjE0PC9pZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MzYwNzEuNDgzNTI3ODMyMDM8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjguNTgzMDY4ODQ3NjkyNTU5ZS0wNTwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD4xNTwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjE4MDM1Ljc0MTc2MzkxNjAxNjwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlc29sdXRpb24+NC4yOTE1MzQ0MjM4NDYyNzllLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xldmVsPjxsZXZlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlkPjE2PC9pZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+OTAxNy44NzA4ODE5NTgwMDg8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjIuMTQ1NzY3MjExOTIzMTM5NmUtMDU8L3Jlc29sdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGV2ZWw+PGxldmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aWQ+MTc8L2lkPgogICAgICAgICAgICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj40NTA4LjkzNTQ0MDk3OTAwNDwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlc29sdXRpb24+MS4wNzI4ODM2MDU5NjE1Njk4ZS0wNTwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD4xODwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjIyNTQuNDY3NzIwNDg5NTAyPC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgICAgICAgICAgICA8cmVzb2x1dGlvbj41LjM2NDQxODAyOTgwNzg0OWUtMDY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGV2ZWw+PGxldmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aWQ+MTk8L2lkPgogICAgICAgICAgICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4xMTI3LjIzMzg2MDI0NDc1MTwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlc29sdXRpb24+Mi42ODIyMDkwMTQ5MDM5MjQ2ZS0wNjwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbD48bGV2ZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpZD4yMDwvaWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjU2My42MTY5MzAxMjIzNzU1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4xLjM0MTEwNDUwNzQ1MTk2MjNlLTA2PC9yZXNvbHV0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9sZXZlbHM+CiAgICAgICAgICAgICAgICAgICAgPC90aWxlTWF0cml4U2V0PgogICAgICAgICAgICAgICAgICA8L3RpbGVNYXRyaXhTZXRzPgogICAgICAgICAgICAgICAgPC9tYXBsYXllcj4KICAgICAgICAgICAgICA8L3Byb2plY3RsYXllcnM+CiAgICAgICAgICAgIDwvZG1hcD4KICAgICAgICAgICAg"  
57 - print('解码:' + str(base64.b64decode(kk), "utf-8"))  
58 - daf=0 58 + # kk="PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxkbWFwIHByb2plY3RuYW1lPSJ3bXRzdGVzdCIgdmVyc2lvbj0iNC4wIj4KICA8cHJvamVjdENycz4KICAgIDxzcGF0aWFscmVmc3lzPgogICAgICA8d2t0Pjwvd2t0PgogICAgICA8cHJvajQ+PC9wcm9qND4KICAgICAgPHNyaWQ+NDQ5MDwvc3JpZD4KICAgICAgPGRlc2NyaXB0aW9uLz4KICAgICAgPHByb2plY3Rpb25hY3JvbnltLz4KICAgIDwvc3BhdGlhbHJlZnN5cz4KICA8L3Byb2plY3RDcnM+CiAgPHByb2plY3RsYXllcnM+CiAgICA8bWFwbGF5ZXIgbmFtZT0ibGF5ZXIiIGFsaWFzPSJOb25lIiB0eXBlPSIwIj4KICAgICAgPGV4dGVudD4KICAgICAgICA8eG1pbj4xMDcuNzg5ODE0OTQxODA2MTg8L3htaW4+CiAgICAgICAgPHltaW4+MTIwLjQzNTUzNjAzOTM1Njc1PC95bWluPgogICAgICAgIDx4bWF4PjEyMC40MzU1MzYwMzkzNTY3NTwveG1heD4KICAgICAgICA8eW1heD4yNS45OTk4Njg3NTc3MzcwMzM8L3ltYXg+CiAgICAgIDwvZXh0ZW50PgogICAgICA8c3R5bGU+ZGVmYXVsdDwvc3R5bGU+CiAgICAgIDxmb3JtYXQ+aW1hZ2UvcG5nPC9mb3JtYXQ+CiAgICAgIDx2ZW5kb3I+RVNSSV9WMTwvdmVuZG9yPgogICAgICA8ZGF0YXNvdXJjZT4vdXNyL2xvY2FsL2RtYXA0L2dkbWFwL19hbGxsYXllcnM8L2RhdGFzb3VyY2U+CiAgICAgIDx0aWxlTWF0cml4U2V0cz4KICAgICAgICA8dGlsZU1hdHJpeFNldD4KICAgICAgICAgIDxpZD5kZWZhdWx0PC9pZD4KICAgICAgICAgIDxjcnM+RVBTRzo6NDQ5MDwvY3JzPgogICAgICAgICAgPHRpbGVDb2xzPjI1NjwvdGlsZUNvbHM+CiAgICAgICAgICA8dGlsZVJvd3M+MjU2PC90aWxlUm93cz4KICAgICAgICAgIDxkcGk+OTY8L2RwaT4KICAgICAgICAgIDx0aWxlT3JpZ2luPgogICAgICAgICAgICA8WD40MDA8L1g+CiAgICAgICAgICAgIDxZPi00MDA8L1k+CiAgICAgICAgICA8L3RpbGVPcmlnaW4+CiAgICAgICAgICA8bGV2ZWxzPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjA8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjU5MDk5NTE4Ni4xMjwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4xLjQwNjI1MDAwMDAwNTk0ODg8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+MTwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+Mjk1NDk3NTkzLjA2PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuNzAzMTI1MDAwMDAyOTc0NDwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgPC9sZXZlbD4KICAgICAgICAgICAgPGxldmVsPgogICAgICAgICAgICAgIDxpZD4yPC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4xNDc3NDg3OTYuNTM8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4zNTE1NjI1MDAwMDE0ODcyPC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjM8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjczODc0Mzk4LjI2NTwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4wLjE3NTc4MTI1MDAwMDc0MzY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+NDwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MzY5MzcxOTkuMTMyNTwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4wLjA4Nzg5MDYyNTAwMDM3MTg8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+NTwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MTg0Njg1OTkuNTY2MjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wNDM5NDUzMTI1MDAxODU5PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjY8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjkyMzQyOTkuNzgzMTI1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDIxOTcyNjU2MjUwMDkyOTU8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+NzwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+NDYxNzE0OS44OTE1NjI1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDEwOTg2MzI4MTI1MDQ2NDc1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjg8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjIzMDg1NzQuOTQ1NzgxMjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDU0OTMxNjQwNjI1MjMyMzc1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjk8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjExNTQyODcuNDcyODkwNjI1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDAyNzQ2NTgyMDMxMjYxNjE4NzwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgPC9sZXZlbD4KICAgICAgICAgICAgPGxldmVsPgogICAgICAgICAgICAgIDxpZD4xMDwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+NTc3MTQzLjczNjQ0NTMxMjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDEzNzMyOTEwMTU2MzA4MDk0PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjExPC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4yODg1NzEuODY4MjIyNjU2MjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDA2ODY2NDU1MDc4MTU0MDQ3PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjEyPC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4xNDQyODUuOTM0MTExMzI4MTM8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDAzNDMzMjI3NTM5MDc3MDIzNDwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgPC9sZXZlbD4KICAgICAgICAgICAgPGxldmVsPgogICAgICAgICAgICAgIDxpZD4xMzwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+NzIxNDIuOTY3MDU1NjY0MDY8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDAxNzE2NjEzNzY5NTM4NTExNzwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgPC9sZXZlbD4KICAgICAgICAgICAgPGxldmVsPgogICAgICAgICAgICAgIDxpZD4xNDwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MzYwNzEuNDgzNTI3ODMyMDM8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+OC41ODMwNjg4NDc2OTI1NTllLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjE1PC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4xODAzNS43NDE3NjM5MTYwMTY8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+NC4yOTE1MzQ0MjM4NDYyNzllLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjE2PC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj45MDE3Ljg3MDg4MTk1ODAwODwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4yLjE0NTc2NzIxMTkyMzEzOTZlLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjE3PC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj40NTA4LjkzNTQ0MDk3OTAwNDwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4xLjA3Mjg4MzYwNTk2MTU2OThlLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjE4PC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4yMjU0LjQ2NzcyMDQ4OTUwMjwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj41LjM2NDQxODAyOTgwNzg0OWUtMDY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+MTk8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjExMjcuMjMzODYwMjQ0NzUxPC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjIuNjgyMjA5MDE0OTAzOTI0NmUtMDY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+MjA8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjU2My42MTY5MzAxMjIzNzU1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjEuMzQxMTA0NTA3NDUxOTYyM2UtMDY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICA8L2xldmVscz4KICAgICAgICA8L3RpbGVNYXRyaXhTZXQ+CiAgICAgIDwvdGlsZU1hdHJpeFNldHM+CiAgICA8L21hcGxheWVyPgogIDwvcHJvamVjdGxheWVycz4KPC9kbWFwPg=="
  59 + # kk="PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxkbWFwIHByb2plY3RuYW1lPSJ3bXRzdGVzdCIgdmVyc2lvbj0iNC4wIj4KICA8cHJvamVjdENycz4KICAgIDxzcGF0aWFscmVmc3lzPgogICAgICA8d2t0Pjwvd2t0PgogICAgICA8cHJvajQ+PC9wcm9qND4KICAgICAgPHNyaWQ+NDQ5MDwvc3JpZD4KICAgICAgPGRlc2NyaXB0aW9uLz4KICAgICAgPHByb2plY3Rpb25hY3JvbnltLz4KICAgIDwvc3BhdGlhbHJlZnN5cz4KICA8L3Byb2plY3RDcnM+CiAgPHByb2plY3RsYXllcnM+CiAgICA8bWFwbGF5ZXIgbmFtZT0ibGF5ZXIiIGFsaWFzPSJOb25lIiB0eXBlPSIwIj4KICAgICAgPGV4dGVudD4KICAgICAgICA8eG1pbj4xMDcuNzg5ODE0OTQxODA2MTg8L3htaW4+CiAgICAgICAgPHltaW4+MTIwLjQzNTUzNjAzOTM1Njc1PC95bWluPgogICAgICAgIDx4bWF4PjEyMC40MzU1MzYwMzkzNTY3NTwveG1heD4KICAgICAgICA8eW1heD4yNS45OTk4Njg3NTc3MzcwMzM8L3ltYXg+CiAgICAgIDwvZXh0ZW50PgogICAgICA8c3R5bGU+ZGVmYXVsdDwvc3R5bGU+CiAgICAgIDxmb3JtYXQ+aW1hZ2UvcG5nPC9mb3JtYXQ+CiAgICAgIDx2ZW5kb3I+RVNSSV9WMTwvdmVuZG9yPgogICAgICA8ZGF0YXNvdXJjZT4vdXNyL2xvY2FsL2RtYXA0L2dkbWFwL19hbGxsYXllcnM8L2RhdGFzb3VyY2U+CiAgICAgIDx0aWxlTWF0cml4U2V0cz4KICAgICAgICA8dGlsZU1hdHJpeFNldD4KICAgICAgICAgIDxpZD5kZWZhdWx0PC9pZD4KICAgICAgICAgIDxjcnM+RVBTRzo6NDQ5MDwvY3JzPgogICAgICAgICAgPHRpbGVDb2xzPjI1NjwvdGlsZUNvbHM+CiAgICAgICAgICA8dGlsZVJvd3M+MjU2PC90aWxlUm93cz4KICAgICAgICAgIDxkcGk+OTY8L2RwaT4KICAgICAgICAgIDx0aWxlT3JpZ2luPgogICAgICAgICAgICA8WD40MDA8L1g+CiAgICAgICAgICAgIDxZPi00MDA8L1k+CiAgICAgICAgICA8L3RpbGVPcmlnaW4+CiAgICAgICAgICA8bGV2ZWxzPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjA8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjU5MDk5NTE4Ni4xMjwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4xLjQwNjI1MDAwMDAwNTk0ODg8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+MTwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+Mjk1NDk3NTkzLjA2PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuNzAzMTI1MDAwMDAyOTc0NDwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgPC9sZXZlbD4KICAgICAgICAgICAgPGxldmVsPgogICAgICAgICAgICAgIDxpZD4yPC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4xNDc3NDg3OTYuNTM8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4zNTE1NjI1MDAwMDE0ODcyPC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjM8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjczODc0Mzk4LjI2NTwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4wLjE3NTc4MTI1MDAwMDc0MzY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+NDwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MzY5MzcxOTkuMTMyNTwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4wLjA4Nzg5MDYyNTAwMDM3MTg8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+NTwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MTg0Njg1OTkuNTY2MjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wNDM5NDUzMTI1MDAxODU5PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjY8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjkyMzQyOTkuNzgzMTI1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDIxOTcyNjU2MjUwMDkyOTU8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+NzwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+NDYxNzE0OS44OTE1NjI1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDEwOTg2MzI4MTI1MDQ2NDc1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjg8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjIzMDg1NzQuOTQ1NzgxMjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDU0OTMxNjQwNjI1MjMyMzc1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjk8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjExNTQyODcuNDcyODkwNjI1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjAuMDAyNzQ2NTgyMDMxMjYxNjE4NzwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgPC9sZXZlbD4KICAgICAgICAgICAgPGxldmVsPgogICAgICAgICAgICAgIDxpZD4xMDwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+NTc3MTQzLjczNjQ0NTMxMjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDEzNzMyOTEwMTU2MzA4MDk0PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjExPC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4yODg1NzEuODY4MjIyNjU2MjU8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDA2ODY2NDU1MDc4MTU0MDQ3PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjEyPC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4xNDQyODUuOTM0MTExMzI4MTM8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDAzNDMzMjI3NTM5MDc3MDIzNDwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgPC9sZXZlbD4KICAgICAgICAgICAgPGxldmVsPgogICAgICAgICAgICAgIDxpZD4xMzwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+NzIxNDIuOTY3MDU1NjY0MDY8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+MC4wMDAxNzE2NjEzNzY5NTM4NTExNzwvcmVzb2x1dGlvbj4KICAgICAgICAgICAgPC9sZXZlbD4KICAgICAgICAgICAgPGxldmVsPgogICAgICAgICAgICAgIDxpZD4xNDwvaWQ+CiAgICAgICAgICAgICAgPHNjYWxlRGVub21pbmF0b3I+MzYwNzEuNDgzNTI3ODMyMDM8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+OC41ODMwNjg4NDc2OTI1NTllLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjE1PC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4xODAzNS43NDE3NjM5MTYwMTY8L3NjYWxlRGVub21pbmF0b3I+CiAgICAgICAgICAgICAgPHJlc29sdXRpb24+NC4yOTE1MzQ0MjM4NDYyNzllLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjE2PC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj45MDE3Ljg3MDg4MTk1ODAwODwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4yLjE0NTc2NzIxMTkyMzEzOTZlLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjE3PC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj40NTA4LjkzNTQ0MDk3OTAwNDwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj4xLjA3Mjg4MzYwNTk2MTU2OThlLTA1PC9yZXNvbHV0aW9uPgogICAgICAgICAgICA8L2xldmVsPgogICAgICAgICAgICA8bGV2ZWw+CiAgICAgICAgICAgICAgPGlkPjE4PC9pZD4KICAgICAgICAgICAgICA8c2NhbGVEZW5vbWluYXRvcj4yMjU0LjQ2NzcyMDQ4OTUwMjwvc2NhbGVEZW5vbWluYXRvcj4KICAgICAgICAgICAgICA8cmVzb2x1dGlvbj41LjM2NDQxODAyOTgwNzg0OWUtMDY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+MTk8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjExMjcuMjMzODYwMjQ0NzUxPC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjIuNjgyMjA5MDE0OTAzOTI0NmUtMDY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICAgIDxsZXZlbD4KICAgICAgICAgICAgICA8aWQ+MjA8L2lkPgogICAgICAgICAgICAgIDxzY2FsZURlbm9taW5hdG9yPjU2My42MTY5MzAxMjIzNzU1PC9zY2FsZURlbm9taW5hdG9yPgogICAgICAgICAgICAgIDxyZXNvbHV0aW9uPjEuMzQxMTA0NTA3NDUxOTYyM2UtMDY8L3Jlc29sdXRpb24+CiAgICAgICAgICAgIDwvbGV2ZWw+CiAgICAgICAgICA8L2xldmVscz4KICAgICAgICA8L3RpbGVNYXRyaXhTZXQ+CiAgICAgIDwvdGlsZU1hdHJpeFNldHM+CiAgICA8L21hcGxheWVyPgogIDwvcHJvamVjdGxheWVycz4KPC9kbWFwPg=="
  60 + # kk="PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxkbWFwIHByb2plY3RuYW1lPSJ0bXN0ZXN0IiB2ZXJzaW9uPSI0LjAiPgogIDxwcm9qZWN0Q3JzPgogICAgPHNwYXRpYWxyZWZzeXM+CiAgICAgIDx3a3Q+PC93a3Q+CiAgICAgIDxwcm9qND48L3Byb2o0PgogICAgICA8c3JpZD40NDkwPC9zcmlkPgogICAgICA8ZGVzY3JpcHRpb24vPgogICAgICA8cHJvamVjdGlvbmFjcm9ueW0vPgogICAgPC9zcGF0aWFscmVmc3lzPgogIDwvcHJvamVjdENycz4KICA8cHJvamVjdGxheWVycz4KICAgIDxtYXBsYXllciBuYW1lPSJsYXllciIgYWxpYXM9Ik5vbmUiIHR5cGU9IjMiPgogICAgICA8ZXh0ZW50PgogICAgICAgIDx4bWluPjEwNy43ODk4MTQ5NDE4MDYxODwveG1pbj4KICAgICAgICA8eW1pbj4xMjAuNDM1NTM2MDM5MzU2NzU8L3ltaW4+CiAgICAgICAgPHhtYXg+MTIwLjQzNTUzNjAzOTM1Njc1PC94bWF4PgogICAgICAgIDx5bWF4PjI1Ljk5OTg2ODc1NzczNzAzMzwveW1heD4KICAgICAgPC9leHRlbnQ+CiAgICAgIDxzdHlsZT5kZWZhdWx0PC9zdHlsZT4KICAgICAgPGZvcm1hdD5pbWFnZS9wbmc8L2Zvcm1hdD4KICAgICAgPHZlbmRvcj5RR0lTPC92ZW5kb3I+CiAgICAgIDxkYXRhc291cmNlPi91c3IvbG9jYWwvZG1hcDQvcWdpczwvZGF0YXNvdXJjZT4KICAgIDwvbWFwbGF5ZXI+CiAgPC9wcm9qZWN0bGF5ZXJzPgo8L2RtYXA+"
  61 + # kk="PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxkbWFwIHByb2plY3RuYW1lPSJ0bXN0ZXN0IiB2ZXJzaW9uPSI0LjAiPgogIDxwcm9qZWN0Q3JzPgogICAgPHNwYXRpYWxyZWZzeXM+CiAgICAgIDx3a3Q+PC93a3Q+CiAgICAgIDxwcm9qND48L3Byb2o0PgogICAgICA8c3JpZD40NDkwPC9zcmlkPgogICAgICA8ZGVzY3JpcHRpb24vPgogICAgICA8cHJvamVjdGlvbmFjcm9ueW0vPgogICAgPC9zcGF0aWFscmVmc3lzPgogIDwvcHJvamVjdENycz4KICA8cHJvamVjdGxheWVycz4KICAgIDxtYXBsYXllciBuYW1lPSJsYXllciIgYWxpYXM9IiIgdHlwZT0iMyI+CiAgICAgIDxleHRlbnQ+CiAgICAgICAgPHhtaW4+MTA3Ljc4OTgxNDk0MTgwNjE4PC94bWluPgogICAgICAgIDx5bWluPjEyMC40MzU1MzYwMzkzNTY3NTwveW1pbj4KICAgICAgICA8eG1heD4xMjAuNDM1NTM2MDM5MzU2NzU8L3htYXg+CiAgICAgICAgPHltYXg+MjUuOTk5ODY4NzU3NzM3MDMzPC95bWF4PgogICAgICA8L2V4dGVudD4KICAgICAgPHN0eWxlPmRlZmF1bHQ8L3N0eWxlPgogICAgICA8Zm9ybWF0PmltYWdlL3BuZzwvZm9ybWF0PgogICAgICA8dmVuZG9yPlFHSVM8L3ZlbmRvcj4KICAgICAgPGRhdGFzb3VyY2U+L3Vzci9sb2NhbC9kbWFwNC9xZ2lzPC9kYXRhc291cmNlPgogICAgPC9tYXBsYXllcj4KICA8L3Byb2plY3RsYXllcnM+CjwvZG1hcD4="
  62 + # print(str(base64.b64decode(kk), "utf-8"))
  63 + # daf=0
  64 +
  65 + zoo: KazooClient = KazooClient(hosts="172.26.99.168:2181", timeout=1)
  66 + zoo.start()
  67 + while 1:
  68 + time.sleep(1)
  69 + print(zoo.connected)
  70 + print(zoo.get_children("/rpc"))
不能预览此文件类型
注册登录 后发表评论