正在显示
21 个修改的文件
包含
189 行增加
和
129 行删除
@@ -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")) |
test/t.tiff
deleted
100644 → 0
不能预览此文件类型
请
注册
或
登录
后发表评论