tornado_api.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. from wechat_action.sql_models import DB
  2. from settings import using_config
  3. import tornado.log
  4. import tornado.ioloop
  5. import tornado.web
  6. from logging import handlers
  7. from wechat_action.login_ad import LogIn
  8. from wechat_action import sql_tools
  9. import threading
  10. from web_module import user_action
  11. from sqlalchemy import Table
  12. import json
  13. import pickle
  14. from datetime import datetime
  15. # TODO:需要添加上supervisor,来维护进程
  16. # TODO:有时间需要对tornado进行改进
  17. # TODO:需要有一套上线工具,来维持线上稳定
  18. db = DB(config=using_config)
  19. wechat_cookies_table = Table('wechat_cookies', db.metadata,
  20. autoload=True, autoload_with=db.engine)
  21. layout_typesetting_table = Table('layout_typesetting', db.metadata,
  22. autoload=True, autoload_with=db.engine)
  23. ad_plan_typesetting_table = Table('ad_plan_typesetting', db.metadata,
  24. autoload=True, autoload_with=db.engine)
  25. action_record_table = Table('action_record', db.metadata,
  26. autoload=True, autoload_with=db.engine)
  27. layout_create_action = 'create_ad_layout'
  28. ad_plan_create_action = 'create_ad_plan'
  29. refresh_wechat_action = 'refresh_wechat_info'
  30. # 1.实现本机服务
  31. # 2.实现线上docker-selenium服务
  32. class BaseHandler(tornado.web.RequestHandler):
  33. def options(self):
  34. pass
  35. def set_default_headers(self):
  36. self.set_header('Access-Control-Allow-Origin', '*')
  37. self.set_header('Access-Control-Allow-Headers', '*')
  38. self.set_header('Access-Control-Max-Age', 1000)
  39. self.set_header('Content-type', '*')
  40. self.set_header('Access-Control-Allow-Methods', '*')
  41. class create_ad_plan_local(BaseHandler):
  42. def post(self):
  43. request_dict = json.loads(self.request.body, encoding='utf-8')
  44. user_id = request_dict['user_id']
  45. ad_plan_list = request_dict['plan_list']
  46. print(user_id, ad_plan_list)
  47. sql_session = db.DBSession()
  48. if user_id is None or ad_plan_list is None:
  49. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  50. return
  51. # 落地页名字精确到毫秒,默认是全局唯一
  52. for _ in ad_plan_list:
  53. ad_plan_name = _['title']
  54. ad_plan_typesetting_info = {'user_id': user_id, 'name': ad_plan_name,
  55. 'typesetting': json.dumps(_, ensure_ascii=False)}
  56. ad_plan_typesetting_inserte = sql_tools.save_ad_plan_typesetting_info(
  57. ad_plan_typesetting_info=ad_plan_typesetting_info,
  58. table_ad_plan_typesetting=ad_plan_typesetting_table)
  59. sql_session.execute(ad_plan_typesetting_inserte)
  60. sql_session.commit()
  61. self.write({'status': {'msg': 'success', "RetCode": 200}})
  62. class create_ad_plan(BaseHandler):
  63. # TODO:只要tornado开着就不允许修改数据库,------想好之后上线如何操作
  64. # TODO:需要与刷新用户cookie相关action 联动,---------正在刷新用户信息时,不能进行计划创建.反之同理
  65. # TODO:名字检查----只保留三种符号(.-_),中文字符长度一,数字字符长度二
  66. @staticmethod
  67. def check_task(user_id):
  68. # TODO:检查是否同user_id的任务在跑中,有的话只保存任务.不做其他事情
  69. sql_session = db.DBSession()
  70. result = sql_tools.get_task_in_hand_num(user_id, sql_session)
  71. return result
  72. def post(self):
  73. try:
  74. sql_session = db.DBSession()
  75. request_dict = json.loads(self.request.body, encoding='utf-8')
  76. print(request_dict)
  77. user_id = request_dict['user_id']
  78. ad_plan_list = request_dict['plan_list']
  79. # 1.查看是否cookie可用
  80. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  81. # 2.数据存入数据库
  82. print(user_id, ad_plan_list)
  83. if user_id is None or ad_plan_list is None:
  84. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  85. return
  86. # 2.1存计划数据
  87. for _ in ad_plan_list:
  88. ad_plan_name = _['title']
  89. ad_plan_typesetting_info = {'user_id': user_id, 'name': ad_plan_name,
  90. 'typesetting': json.dumps(_, ensure_ascii=False)}
  91. print('typesetting_info')
  92. print(_)
  93. print(ad_plan_typesetting_info)
  94. ad_plan_typesetting_inserte = sql_tools.save_ad_plan_typesetting_info(
  95. ad_plan_typesetting_info=ad_plan_typesetting_info,
  96. table_ad_plan_typesetting=ad_plan_typesetting_table)
  97. sql_session.execute(ad_plan_typesetting_inserte)
  98. sql_session.commit()
  99. # 2.2存行为记录
  100. task_name = 'user_id: {user_id} time:{time_sign} action:create_plan'.format(user_id=user_id,
  101. time_sign=datetime.now().strftime(
  102. "%Y-%m-%d, %H:%M:%S"))
  103. for _ in ad_plan_list:
  104. print(_)
  105. for action_type in [layout_create_action, ad_plan_create_action]:
  106. object_name = _['title'] if action_type == 'create_ad_plan' else _['idea']['jump_type_page_type'][
  107. 'layout_name']
  108. action_info = {'user_id': user_id, 'service_name': _['service_name'],
  109. 'wechat_name': _['wechat_name'],
  110. 'action_type': action_type, 'object_name': object_name, 'task_name': task_name,
  111. 'status': 'todo'}
  112. record_insert = sql_tools.save_action_record(action_record_info=action_info,
  113. table_action_record=action_record_table)
  114. sql_session.execute(record_insert)
  115. sql_session.commit()
  116. # 4.开始运行
  117. if not self.check_task(user_id=user_id):
  118. threading.Thread(target=user_action.carry_plan,
  119. args=(user_id, ad_plan_list, log_ad, db, cookie_canuse)).start()
  120. else:
  121. self.write({'status': {'msg': '', "RetCode": 200}})
  122. except Exception as e:
  123. self.write('eror')
  124. try:
  125. sql_session.commit()
  126. except:
  127. pass
  128. class get_ad_plan_local(BaseHandler):
  129. def get(self):
  130. user_id = self.get_argument('user_id', None)
  131. layout_name = self.get_argument('plan_name', None)
  132. sql_session = db.DBSession()
  133. if user_id is None:
  134. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  135. return
  136. # 落地页名字精确到毫秒,默认是全局唯一
  137. if layout_name:
  138. result = sql_tools.get_plan_typesetting_rough(sql_session=sql_session, user_id=user_id,
  139. typesetting_name=layout_name)
  140. else:
  141. # TODO:之后修改一下,让其查询效率高点,like效率过低
  142. layout_name = ''
  143. result = sql_tools.get_plan_typesetting_rough(sql_session=sql_session, user_id=user_id,
  144. typesetting_name=layout_name)
  145. print(result)
  146. result_ = []
  147. for i in range(len(result)):
  148. print(result[i])
  149. typesetting, name, create_time, update_time = result[i]
  150. _ = {}
  151. _['typesetting'] = json.loads(typesetting)
  152. _['ad_plan_name'] = name
  153. _['id'] = i
  154. _['create_time'] = create_time.strftime("%Y-%m-%d %H:%M:%S")
  155. _['update_time'] = update_time.strftime("%Y-%m-%d %H:%M:%S")
  156. result_.append(_)
  157. self.write({'status': {'msg': 'success', "RetCode": 200},
  158. 'local_ad_plan_info': result_})
  159. class create_ad_layout_local(BaseHandler):
  160. def post(self):
  161. # TODO:返回一个layout_name重复的一个信息
  162. request_dict = json.loads(self.request.body)
  163. user_id = request_dict['user_id']
  164. layout_typesetting = request_dict['layout_typesetting']
  165. layout_name = request_dict['layout_name']
  166. print(user_id, layout_typesetting, layout_name)
  167. print('layout-typesetting', type(layout_typesetting), layout_typesetting)
  168. sql_session = db.DBSession()
  169. if user_id is None or layout_name is None or layout_typesetting is None:
  170. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  171. return
  172. # 落地页名字精确到毫秒,默认是全局唯一
  173. layout_typesetting_info = {'user_id': user_id, 'name': layout_name,
  174. 'typesetting': layout_typesetting}
  175. layout_typesetting_inserte = sql_tools.save_layout_typesetting_info(
  176. layout_typesetting_info=layout_typesetting_info,
  177. table_layout_typesetting=layout_typesetting_table)
  178. sql_session.execute(layout_typesetting_inserte)
  179. sql_session.commit()
  180. self.write({'status': {'msg': 'success', "RetCode": 200}})
  181. class get_ad_layout_local(BaseHandler):
  182. def get(self):
  183. user_id = self.get_argument('user_id', None)
  184. layout_name = self.get_argument('layout_name', None)
  185. sql_session = db.DBSession()
  186. if user_id is None:
  187. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  188. return
  189. # 落地页名字精确到毫秒,默认是全局唯一
  190. if layout_name:
  191. result = sql_tools.get_layout_typesetting_rough(sql_session=sql_session, user_id=user_id,
  192. typesetting_name=layout_name)
  193. else:
  194. # TODO:之后修改一下,让其查询效率高点,like效率过低
  195. layout_name = ''
  196. result = sql_tools.get_layout_typesetting_rough(sql_session=sql_session, user_id=user_id,
  197. typesetting_name=layout_name)
  198. print(result)
  199. result_ = []
  200. for i in range(len(result)):
  201. print(result[i])
  202. typesetting, name, create_time, update_time = result[i]
  203. _ = {}
  204. _['typesetting'] = json.loads(typesetting)
  205. _['layout_name'] = name
  206. _['id'] = i
  207. _['create_time'] = create_time.strftime("%Y-%m-%d %H:%M:%S")
  208. _['update_time'] = update_time.strftime("%Y-%m-%d %H:%M:%S")
  209. result_.append(_)
  210. self.write({'status': {'msg': 'success', "RetCode": 200},
  211. 'local_layout_info': result_})
  212. # TODO:wechat_info,human_info 这两张表有空时需要进行对应改进
  213. # TODO:ad_human_info ,ad_wecaht_info 两个的行为需要与create_ad_plan 进行交互
  214. class ad_human_info(BaseHandler):
  215. # TODO:设置一下update---table,如果失败了sql_session需要关闭
  216. @staticmethod
  217. def refresh_wechat_cookies(tornado_web, user_id):
  218. # TODO:添加互动接口,添加状态字段,打开selenium就变换
  219. # 1.返回二维码链接
  220. # ----1.查看cookie是否可用
  221. sql_session = db.DBSession()
  222. cookie_db = sql_tools.get_wechat_cookies(sql_session, user_id=user_id)
  223. # 进行登录操作
  224. log_ad = LogIn(user_id=user_id)
  225. # 使driver可以使用
  226. cookie_canuse = False
  227. if cookie_db:
  228. cookie_db = pickle.loads(cookie_db)
  229. if not log_ad.wechat_cookies_check_alive(cookie_db):
  230. # cookie 不能使用
  231. wechat_code = log_ad.log_in()
  232. tornado_web.write({'status': {'msg': 'success', "RetCode": 200},
  233. 'wechat_code': wechat_code})
  234. print('cookie can not use')
  235. else:
  236. # cookie 可以继续使用
  237. cookie_canuse = True
  238. log_ad.driver.get('https://a.weixin.qq.com/index.html')
  239. tornado_web.write({'status': {'msg': 'success', "RetCode": 200}})
  240. else:
  241. # cookie 不能使用
  242. wechat_code = log_ad.log_in()
  243. tornado_web.write({'status': {'msg': 'success', "RetCode": 200},
  244. 'wechat_code': wechat_code})
  245. return log_ad, cookie_canuse
  246. # 1.人群包获取
  247. def get(self):
  248. sql_session = db.DBSession()
  249. try:
  250. # 0.是否刷新
  251. # 1.获取userid,以及是否刷新
  252. user_id = self.get_argument("user_id", None)
  253. human_package_name = self.get_argument('human_package_name', None)
  254. is_refresh = self.get_argument("is_refresh", None)
  255. wechat_name = self.get_argument('wechat_name', None)
  256. service_name = self.get_argument('service_name', None)
  257. print(user_id, is_refresh)
  258. if user_id is None or is_refresh is None or wechat_name is None or service_name is None:
  259. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  260. return
  261. # TODO:一个涉及到selenium-driver的请求-生命周期.----看一下tornado是怎么处理请求的生命周期
  262. if int(is_refresh) == 1:
  263. log_ad, cookie_canuse = self.refresh_wechat_cookies(self, user_id=user_id)
  264. task_name = 'user_id: {user_id} time:{time_sign} action:refresh_wechat_info'.format(user_id=user_id,
  265. time_sign=datetime.now().strftime(
  266. "%Y-%m-%d, %H:%M:%S"))
  267. # 行为记录
  268. action_type = refresh_wechat_action
  269. object_name = ''
  270. service_name = ''
  271. wechat_name = ''
  272. action_info = {'user_id': user_id, 'service_name': service_name, 'wechat_name': wechat_name,
  273. 'action_type': action_type, 'object_name': object_name, 'task_name': task_name,
  274. 'status': 'todo'}
  275. record_insert = sql_tools.save_action_record(action_record_info=action_info,
  276. table_action_record=action_record_table)
  277. sql_session.execute(record_insert)
  278. sql_session.commit()
  279. if not create_ad_plan.check_task(user_id=user_id):
  280. threading.Thread(target=user_action.get_human_info,
  281. args=(
  282. user_id, log_ad, db, cookie_canuse)).start()
  283. else:
  284. self.write({'status': {'msg': '', "RetCode": 200}})
  285. else:
  286. # 1.查看是否在刷新,
  287. # 在刷新中,
  288. # 返回正在刷新
  289. # -------不管上面逻辑让他们多刷新几次
  290. # 不在刷新
  291. # 返回对应数据
  292. # 2.获取userid对应数据
  293. result = sql_tools.get_human_info(sql_session=sql_session,
  294. service_name=service_name, wechat_name=wechat_name)
  295. print(result)
  296. result = json.loads(result)
  297. if human_package_name:
  298. result = [_ for _ in result if human_package_name in _['name']]
  299. result_ = []
  300. for i in range(len(result)):
  301. _ = result[i]
  302. _['id'] = i
  303. result_.append(_)
  304. self.write({'status': {'msg': 'success', "RetCode": 200},
  305. 'human_info': result})
  306. except Exception as e:
  307. logging.error(str(e))
  308. try:
  309. sql_session.commit()
  310. except:
  311. pass
  312. class ad_wechat_info(BaseHandler):
  313. # 1.公众号相关信息获取
  314. def get(self):
  315. try:
  316. # TODO:添加分页,
  317. # 公众号,服务商,唯一id设计或者获取
  318. # 0.是否刷新
  319. # 1.获取userid,以及是否刷新
  320. user_id = self.get_argument("user_id", None)
  321. is_refresh = self.get_argument("is_refresh", None)
  322. print(user_id, is_refresh)
  323. if user_id is None or is_refresh is None:
  324. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  325. return
  326. sql_session = db.DBSession()
  327. if int(is_refresh) == 1:
  328. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  329. task_name = 'user_id: {user_id} time:{time_sign} action:refresh_wechat_info'.format(user_id=user_id,
  330. time_sign=datetime.now().strftime(
  331. "%Y-%m-%d, %H:%M:%S"))
  332. # 行为记录
  333. action_type = refresh_wechat_action
  334. object_name = ''
  335. service_name = ''
  336. wechat_name = ''
  337. action_info = {'user_id': user_id, 'service_name': service_name, 'wechat_name': wechat_name,
  338. 'action_type': action_type, 'object_name': object_name, 'task_name': task_name,
  339. 'status': 'todo'}
  340. record_insert = sql_tools.save_action_record(action_record_info=action_info,
  341. table_action_record=action_record_table)
  342. sql_session.execute(record_insert)
  343. sql_session.commit()
  344. #检查有无其他任务在处理中,有则等待
  345. if not create_ad_plan.check_task(user_id=user_id):
  346. threading.Thread(target=user_action.get_human_info,
  347. args=(
  348. user_id, log_ad, db, cookie_canuse)).start()
  349. else:
  350. self.write({'status': {'msg': '', "RetCode": 200}})
  351. else:
  352. result = sql_tools.get_wechat_info(sql_session=sql_session, user_id=user_id)
  353. result_list = []
  354. for _ in result:
  355. service_name, wechat_name = _
  356. result_list.append({'service_name': service_name, 'wechat_name': wechat_name})
  357. print(result_list)
  358. self.write({'status': {'msg': 'success', "RetCode": 200},
  359. 'wechat_info': result_list})
  360. except Exception as e:
  361. try:
  362. sql_session.commit()
  363. except:
  364. pass
  365. class delete_ad_layout(BaseHandler):
  366. def get(self):
  367. user_id = self.get_argument('user_id', None)
  368. layout_name = self.get_argument('layout_name', None)
  369. sql_session = db.DBSession()
  370. if user_id is None or layout_name is None:
  371. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  372. return
  373. # 落地页名字精确到毫秒,默认是全局唯一
  374. sql_tools.delete_layout_typesetting_vir(sql_session=sql_session, user_id=user_id,
  375. typesetting_name=layout_name)
  376. self.write({'status': {'msg': 'success', "RetCode": 200}})
  377. class delete_ad_plan(BaseHandler):
  378. def get(self):
  379. user_id = self.get_argument('user_id', None)
  380. plan_name = self.get_argument('plan_name', None)
  381. service_name = self.get_argument('service_name', None)
  382. wechat_name = self.get_argument('wechat_name', None)
  383. sql_session = db.DBSession()
  384. if user_id is None or plan_name is None:
  385. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  386. return
  387. # 落地页名字精确到毫秒,默认是全局唯一
  388. sql_tools.delete_ad_plan_typesetting_vir(sql_session=sql_session, user_id=user_id,
  389. typesetting_name=plan_name, wechat_name=wechat_name,
  390. service_name=service_name)
  391. self.write({'status': {'msg': 'success', "RetCode": 200}})
  392. class get_ad_wechat_service_name(BaseHandler):
  393. def get(self):
  394. user_id = self.get_argument('user_id', None)
  395. sql_session = db.DBSession()
  396. if user_id is None:
  397. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  398. return
  399. result = sql_tools.get_wechat_info_service_name(sql_session=sql_session, user_id=user_id)
  400. result_list = []
  401. for _ in result:
  402. service_name = _
  403. result_list.append({'service_name': service_name})
  404. print(result_list)
  405. self.write({'status': {'msg': 'success', "RetCode": 200},
  406. 'wechat_info': result_list})
  407. class get_ad_wechat_wechat_name(BaseHandler):
  408. def get(self):
  409. user_id = self.get_argument('user_id', None)
  410. service_name = self.get_argument('service_name', None)
  411. sql_session = db.DBSession()
  412. if user_id is None or service_name is None:
  413. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  414. return
  415. result = sql_tools.get_wechat_info_wechat_name(sql_session=sql_session, user_id=user_id,
  416. service_name=service_name)
  417. result_list = []
  418. for _ in result:
  419. service_name, wechat_name = _
  420. result_list.append({'service_name': service_name, 'wechat_name': wechat_name})
  421. print(result_list)
  422. self.write({'status': {'msg': 'success', "RetCode": 200},
  423. 'wechat_info': result_list})
  424. class get_plan_action_record(BaseHandler):
  425. def get(self):
  426. user_id = self.get_argument('user_id', None)
  427. service_name = self.get_argument('service_name', None)
  428. wechat_name = self.get_argument('wechat_name', None)
  429. status = self.get_argument('status', None)
  430. plan_name = self.get_argument('plan_name', None)
  431. sql_session = db.DBSession()
  432. if user_id is None:
  433. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  434. return
  435. # 落地页名字精确到毫秒,默认是全局唯一
  436. result = sql_tools.get_plan_record(sql_session=sql_session, user_id=user_id,
  437. service_name=service_name, wechat_name=wechat_name,
  438. status=status, plan_name=plan_name)
  439. result_ = []
  440. for i in range(len(result)):
  441. print(result[i])
  442. user_id, name, service_name, wechat_name, create_time, status, typesetting, wechat_id_info = result[i]
  443. _ = {}
  444. _['typesetting'] = json.loads(typesetting)
  445. _['ad_plan_name'] = name
  446. _['id'] = i
  447. _['create_time'] = create_time.strftime("%Y-%m-%d %H:%M:%S")
  448. _['service_name'] = service_name
  449. _['wechat_name'] = wechat_name
  450. _['wechat_id_info'] = wechat_id_info
  451. _['status'] = status
  452. result_.append(_)
  453. self.write({'status': {'msg': 'success', "RetCode": 200},
  454. 'local_ad_plan_info': result_})
  455. class get_all_ad_task(BaseHandler):
  456. def get(self):
  457. user_id = self.get_argument('user_id', None)
  458. sql_session = db.DBSession()
  459. if user_id is None:
  460. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  461. return
  462. # 落地页名字精确到毫秒,默认是全局唯一
  463. result = sql_tools.get_ad_task(sql_session=sql_session, user_id=user_id)
  464. task_dict = {}
  465. localtion = ['wechat', '']
  466. for _ in result:
  467. task_name, status, task_status_num, create_time, typesetting = _
  468. print(typesetting)
  469. typesetting = json.loads(typesetting)
  470. if typesetting['plan_base'][1] == 'pyq':
  471. localtion[1] = 'pyq'
  472. create_time = create_time.strftime("%Y-%m-%d %H:%M:%S")
  473. if task_name not in task_dict.keys():
  474. task_dict[task_name] = {}
  475. task_dict[task_name][status] = (task_status_num, create_time)
  476. result_ = []
  477. num = 0
  478. for k, v in task_dict.items():
  479. # TODO:修改为dict的sort
  480. sum_num = 0
  481. print(k, v)
  482. new_dict = {}
  483. create_time = None
  484. for k_, v_ in v.items():
  485. task_status_num, create_time = v_
  486. sum_num = sum_num + task_status_num
  487. new_dict[k_] = task_status_num
  488. status = 'todo' if 'todo' in new_dict.keys() else 'done'
  489. task_dict[k]['sum_num'] = sum_num
  490. new_dict['sum_num'] = sum_num
  491. result_.append(
  492. {'task_name': k, 'task_info': new_dict, 'create_time': create_time, 'channel': localtion[0],
  493. 'localtion': localtion[1], 'id': num, 'status': status})
  494. num = num + 1
  495. print(json.dumps(task_dict))
  496. self.write({'status': {'msg': 'success', "RetCode": 200},
  497. 'local_ad_plan_info': result_})
  498. def heart_jump():
  499. # TODO:tornado 心跳检测,下周做----线程不断检查,线程生命周期60分钟
  500. pass
  501. def make_app():
  502. return tornado.web.Application([
  503. ("/get_all_ad_task", get_all_ad_task), # 获取所有任务状态,
  504. ("/create_ad_plan", create_ad_plan), #
  505. ("/get_ad_wechat_service_name", get_ad_wechat_service_name),
  506. ("/get_ad_wechat_wechat_name", get_ad_wechat_wechat_name),
  507. # ("/create_ad_plan_local", create_ad_plan_local),
  508. ("/create_ad_layout_local", create_ad_layout_local),
  509. ("/get_layout_local", get_ad_layout_local),
  510. ("/get_ad_plan_local", get_ad_plan_local),
  511. ("/delete_layout_local", delete_ad_layout),
  512. ("/delete_ad_plan_local", delete_ad_plan),
  513. # ("/create_ad_layout_remote", create_ad_layout_remote),
  514. ("/ad_human_info", ad_human_info),
  515. ("/ad_wechat_info", ad_wechat_info),
  516. ("/get_plan_action_record", get_plan_action_record),
  517. ], debug=True, autoreload=True)
  518. if __name__ == "__main__":
  519. import logging
  520. logging.basicConfig(
  521. handlers=[
  522. logging.handlers.RotatingFileHandler('./tornado.log',
  523. maxBytes=10 * 1024 * 1024,
  524. backupCount=5,
  525. encoding='utf-8')
  526. , logging.StreamHandler() # 供输出使用
  527. ],
  528. level=logging.INFO,
  529. format="%(asctime)s - %(levelname)s %(filename)s %(funcName)s %(lineno)s - %(message)s"
  530. )
  531. handler = logging.FileHandler('tornado.log')
  532. logger = logging.getLogger()
  533. logger.addHandler(handler)
  534. logger.setLevel(logging.INFO)
  535. app = make_app()
  536. app.listen(8888)
  537. tornado.ioloop.IOLoop.current().start()