app.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. import random
  2. import os
  3. import logging
  4. import datetime
  5. import json
  6. import time
  7. import traceback
  8. import ast
  9. from gevent import monkey
  10. monkey.patch_all()
  11. from flask import Flask, request
  12. from log import Log
  13. from config import set_config
  14. from recommend import video_homepage_recommend, video_relevant_recommend
  15. from category import get_category_videos
  16. from video_recall import PoolRecall
  17. from db_helper import RedisHelper
  18. from gevent.pywsgi import WSGIServer
  19. from multiprocessing import cpu_count, Process
  20. from utils import update_video_w_h_rate
  21. from user2new import user2new
  22. from params_helper import Params
  23. from manager_op import get_video_list, search_video
  24. from ad_recommend import ad_recommend_predict, ad_recommend_predict_with_roi
  25. # from werkzeug.middleware.profiler import ProfilerMiddleware
  26. # from geventwebsocket.handler import WebSocketHandler
  27. from apscheduler.schedulers.background import BackgroundScheduler
  28. log_ = Log()
  29. config_ = set_config()
  30. level_weight = {'1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '6': 1}
  31. flow_pool_abtest_config = {'control_group': [7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
  32. 'experimental_flow_set_level': [],
  33. 'experimental_flow_set_level_score': []}
  34. ad_arpu = 0
  35. ad_roi_param = 0
  36. def update_flow_pool_config():
  37. """
  38. 定时更新流量池相关预设配置到内存变量中
  39. 1. level_weight: 流量池层级权重
  40. 2. flow_pool_abtest_config: 流量池ab实验配置
  41. :return: None
  42. """
  43. redis_helper = RedisHelper()
  44. global level_weight
  45. level_weight_initial = redis_helper.get_data_from_redis(key_name=config_.FLOWPOOL_LEVEL_WEIGHT_KEY_NAME)
  46. if level_weight_initial is not None:
  47. level_weight = json.loads(level_weight_initial)
  48. global flow_pool_abtest_config
  49. flow_pool_abtest_config = redis_helper.get_data_from_redis(key_name=config_.FLOWPOOL_ABTEST_KEY_NAME)
  50. if flow_pool_abtest_config is not None:
  51. flow_pool_abtest_config = json.loads(flow_pool_abtest_config)
  52. def update_ad_roi_predict_params():
  53. """
  54. 定时更新广告预测相关预设配置到内存变量中
  55. 1. arpu: 上一周期arpu值
  56. 2. roi_param: 计算roi使用参数
  57. :return: None
  58. """
  59. redis_helper = RedisHelper()
  60. global ad_arpu
  61. ad_arpu_initial = redis_helper.get_data_from_redis(key_name=config_.KEY_NAME_AD_ARPU)
  62. if ad_arpu_initial is not None:
  63. ad_arpu = float(ad_arpu_initial)
  64. global ad_roi_param
  65. ad_roi_param_initial = redis_helper.get_data_from_redis(key_name=config_.KEY_NAME_AD_ROI_PARAM)
  66. if ad_roi_param_initial is not None:
  67. ad_roi_param = float(ad_roi_param_initial)
  68. sched = BackgroundScheduler(daemon=True, timezone='Asia/Shanghai') # 指定时区
  69. sched.add_job(func=update_flow_pool_config, trigger="interval", seconds=10*60) # 间隔10min后启动
  70. sched.add_job(func=update_ad_roi_predict_params, trigger="interval", seconds=60) # 间隔1min后启动(每1min执行一次)
  71. update_flow_pool_config()
  72. update_ad_roi_predict_params()
  73. sched.start()
  74. app = Flask(__name__)
  75. @app.route('/healthcheck')
  76. def health_check():
  77. return 'ok!'
  78. # 首页推荐及tab分类
  79. @app.route('/applet/video/homepage/recommend', methods=['GET', 'POST'])
  80. def homepage_recommend():
  81. start_time = time.time()
  82. # in_homepage = start_time * 1000 + random.randint(0, 100)
  83. # log_.info({'type': 'homepage', 'in_homepage': in_homepage})
  84. try:
  85. global level_weight
  86. # log_.info({'request_headers': request.headers})
  87. request_data = json.loads(request.get_data())
  88. request_id = request_data.get('requestId')
  89. mid = request_data.get('mid')
  90. uid = request_data.get('uid')
  91. category_id = request_data.get('categoryId')
  92. size = request_data.get('size', 4)
  93. app_type = request_data.get('appType', 4)
  94. algo_type = request_data.get('algoType')
  95. client_info = request_data.get('clientInfo')
  96. ab_exp_info = request_data.get('abExpInfo', None)
  97. ab_info_data = request_data.get('abInfoData', None)
  98. version_audit_status = request_data.get('versionAuditStatus', 2) # 小程序版本审核参数:1-审核中,2-审核通过,默认:2
  99. machineinfoBrand = request_data.get('machineinfoBrand', '')
  100. machineinfoModel = request_data.get('machineinfoModel', '')
  101. machineinfoPlatform = request_data.get('machineinfoPlatform', '')
  102. pagesource = request_data.get('pageSource', '')
  103. versioncode = request_data.get('versionCode', 0)
  104. recommendsource = request_data.get('recommendSource', '0')
  105. sencetype = request_data.get('senceType', 0)
  106. hotSenceType = request_data.get('hotSenceType', 0)
  107. recomTraceId=request_data.get('recomTraceId', "")
  108. env_dict = {}
  109. try:
  110. env_dict['app_type'] = int(app_type)
  111. env_dict['pagesource'] = str(pagesource)
  112. env_dict['versioncode'] = int(versioncode)
  113. env_dict['machineinfo_brand'] = str(machineinfoBrand)
  114. env_dict['machineinfo_model'] = str(machineinfoModel)
  115. env_dict['machineinfo_platform'] = str(machineinfoPlatform)
  116. env_dict['recommendsource'] = str(recommendsource)
  117. env_dict['sencetype'] = int(sencetype)
  118. env_dict['hotSenceType'] = int(hotSenceType)
  119. env_dict['recomTraceId'] = recomTraceId
  120. env_dict['recomInterface'] = "homepage"
  121. except:
  122. env_dict['app_type'] = 4
  123. env_dict['pagesource'] = str(pagesource)
  124. env_dict['versioncode'] = 0
  125. env_dict['machineinfo_brand'] = str(machineinfoBrand)
  126. env_dict['machineinfo_model'] = str(machineinfoModel)
  127. env_dict['machineinfo_platform'] = str(machineinfoPlatform)
  128. env_dict['recommendsource'] = str(recommendsource)
  129. env_dict['sencetype'] = sencetype
  130. env_dict['hotSenceType'] = int(hotSenceType)
  131. env_dict['recomTraceId'] = recomTraceId
  132. env_dict['recomInterface'] = "homepage"
  133. log_.error("feature error",env_dict)
  134. params = Params(request_id=request_id)
  135. # size默认为10
  136. if not size:
  137. size = 10
  138. if category_id in config_.CATEGORY['recommend']:
  139. # 推荐
  140. recommend_result = video_homepage_recommend(
  141. request_id=request_id,
  142. mid=mid,
  143. uid=uid,
  144. size=size,
  145. app_type=app_type,
  146. algo_type=algo_type,
  147. client_info=client_info,
  148. ab_exp_info=ab_exp_info,
  149. params=params,
  150. ab_info_data=ab_info_data,
  151. version_audit_status=version_audit_status,
  152. env_dict=env_dict,
  153. level_weight=level_weight,
  154. flow_pool_abtest_config=flow_pool_abtest_config
  155. )
  156. result = {'code': 200, 'message': 'success', 'data': {'videos': recommend_result['videos']}}
  157. log_message = {
  158. 'requestUri': '/applet/video/homepage/recommend',
  159. 'logTimestamp': int(time.time() * 1000),
  160. 'request_id': request_id,
  161. 'app_type': app_type,
  162. 'client_info': client_info,
  163. 'ab_exp_info': ab_exp_info,
  164. 'ab_info_data': ab_info_data,
  165. 'version_audit_status': version_audit_status,
  166. 'category_id': category_id,
  167. 'mid': mid,
  168. 'uid': uid,
  169. 'getRecommendParamsTime': recommend_result.get('getRecommendParamsTime', ''),
  170. 'getRecommendResultTime': recommend_result.get('getRecommendResultTime', ''),
  171. 'updateRedisDataTime': recommend_result.get('updateRedisDataTime', ''),
  172. 'recommendOperation': recommend_result.get('recommendOperation', ''),
  173. 'result': result,
  174. 'executeTime': (time.time() - start_time) * 1000,
  175. 'fea_info': recommend_result.get('fea_info', {})
  176. }
  177. log_.info(log_message)
  178. # log_.info('category_id: {}, mid: {}, uid: {}, result: {}, execute time = {}ms'.format(
  179. # category_id, mid, uid, result, (time.time() - start_time)*1000))
  180. return json.dumps(result)
  181. elif category_id in config_.CATEGORY['other']:
  182. # 其他类别
  183. videos = get_category_videos()
  184. result = {'code': 200, 'message': 'success', 'data': {'videos': videos}}
  185. log_.info('category_id: {}, mid: {}, uid: {}, result: {}, execute time = {}ms'.format(
  186. category_id, mid, uid, result, (time.time() - start_time) * 1000))
  187. return json.dumps(result)
  188. else:
  189. log_.error('categoryId error, categoryId = {}'.format(category_id))
  190. result = {'code': -1, 'message': 'categoryId error'}
  191. return json.dumps(result)
  192. except Exception as e:
  193. log_.error(traceback.format_exc())
  194. result = {'code': -1, 'message': 'fail'}
  195. return json.dumps(result)
  196. # 相关推荐
  197. @app.route('/applet/video/relevant/recommend', methods=['GET', 'POST'])
  198. def relevant_recommend():
  199. start_time = time.time()
  200. # in_relevant = start_time * 1000 + random.randint(0, 100)
  201. # log_.info({"type": "relevant", "in_relevant": in_relevant})
  202. try:
  203. global level_weight
  204. request_data = json.loads(request.get_data())
  205. request_id = request_data.get('requestId')
  206. # log_.info({
  207. # 'logTimestamp': int(time.time() * 1000),
  208. # 'request_id': request_id,
  209. # 'in_relevant': in_relevant,
  210. # 'type': "relevant_recommend",
  211. # 'text': 'in relevant_recommend',
  212. # 'executeTime': (time.time() - start_time) * 1000
  213. # })
  214. mid = request_data.get('mid')
  215. uid = request_data.get('uid')
  216. video_id = request_data.get('videoId')
  217. # up_uid = request_data.get('upUid')
  218. # share_mid = request_data.get('shareMid')
  219. # share_uid = request_data.get('shareUid')
  220. # page_num = request_data.get('pageNum', 1)
  221. page_size = request_data.get('pageSize', 4)
  222. app_type = request_data.get('appType')
  223. client_info = request_data.get('clientInfo')
  224. ab_exp_info = request_data.get('abExpInfo', None)
  225. page_type = request_data.get('pageType') # 1:详情页;2:分享页
  226. ab_info_data = request_data.get('abInfoData', None)
  227. version_audit_status = request_data.get('versionAuditStatus', 2) # 小程序版本审核参数:1-审核中,2-审核通过,默认:2
  228. machineinfoBrand = request_data.get('machineinfoBrand', '')
  229. machineinfoModel = request_data.get('machineinfoModel', '')
  230. machineinfoPlatform = request_data.get('machineinfoPlatform', '')
  231. pagesource = request_data.get('pageSource', '')
  232. versioncode = request_data.get('versionCode', 0)
  233. recommendsource = request_data.get('recommendSource', '0')
  234. sencetype = request_data.get('senceType', 0)
  235. hotSenceType = request_data.get('hotSenceType', 0)
  236. recomTraceId = request_data.get('recomTraceId', "")
  237. env_dict = {}
  238. try:
  239. env_dict['app_type'] = int(app_type)
  240. env_dict['pagesource'] = str(pagesource)
  241. env_dict['versioncode'] = int(versioncode)
  242. env_dict['machineinfo_brand'] = str(machineinfoBrand)
  243. env_dict['machineinfo_model'] = str(machineinfoModel)
  244. env_dict['machineinfo_platform'] = str(machineinfoPlatform)
  245. env_dict['recommendsource'] = str(recommendsource)
  246. env_dict['sencetype'] = int(sencetype)
  247. env_dict['hotSenceType'] = int(hotSenceType)
  248. env_dict['recomInterface'] = "relevant_recommend"
  249. env_dict['recomTraceId'] = recomTraceId
  250. env_dict['relevant_video_id'] = video_id
  251. except:
  252. env_dict['app_type'] = 4
  253. env_dict['pagesource'] = str(pagesource)
  254. env_dict['versioncode'] = 0
  255. env_dict['machineinfo_brand'] = str(machineinfoBrand)
  256. env_dict['machineinfo_model'] = str(machineinfoModel)
  257. env_dict['machineinfo_platform'] = str(machineinfoPlatform)
  258. env_dict['recommendsource'] = str(recommendsource)
  259. env_dict['sencetype'] = sencetype
  260. env_dict['hotSenceType'] = int(hotSenceType)
  261. env_dict['recomInterface'] = "relevant_recommend"
  262. env_dict['relevant_video_id'] = video_id
  263. env_dict['recomTraceId'] = recomTraceId
  264. log_.error("feature error", env_dict)
  265. params = Params(request_id=request_id)
  266. recommend_result = video_relevant_recommend(
  267. request_id=request_id,
  268. video_id=video_id,
  269. mid=mid,
  270. uid=uid,
  271. size=page_size,
  272. app_type=app_type,
  273. ab_exp_info=ab_exp_info,
  274. client_info=client_info,
  275. page_type=page_type,
  276. params=params,
  277. ab_info_data=ab_info_data,
  278. version_audit_status=version_audit_status,
  279. env_dict=env_dict,
  280. level_weight=level_weight,
  281. flow_pool_abtest_config=flow_pool_abtest_config
  282. )
  283. result = {'code': 200, 'message': 'success', 'data': {'videos': recommend_result['videos']}}
  284. log_message = {
  285. 'requestUri': '/applet/video/relevant/recommend',
  286. 'logTimestamp': int(time.time() * 1000),
  287. 'request_id': request_id,
  288. 'app_type': app_type,
  289. 'client_info': client_info,
  290. 'ab_exp_info': ab_exp_info,
  291. 'ab_info_data': ab_info_data,
  292. 'version_audit_status': version_audit_status,
  293. 'mid': mid,
  294. 'uid': uid,
  295. 'getRecommendParamsTime': recommend_result.get('getRecommendParamsTime', ''),
  296. 'getRecommendResultTime': recommend_result.get('getRecommendResultTime', ''),
  297. 'updateRedisDataTime': recommend_result.get('updateRedisDataTime', ''),
  298. 'recommendOperation': recommend_result.get('recommendOperation', ''),
  299. 'result': result,
  300. 'executeTime': (time.time() - start_time) * 1000,
  301. 'fea_info': recommend_result.get('fea_info', {})
  302. }
  303. log_.info(log_message)
  304. # log_.info('app_type: {}, mid: {}, uid: {}, relevant-result: {}, execute time = {}ms'.format(
  305. # app_type, mid, uid, result, (time.time() - start_time) * 1000))
  306. return json.dumps(result)
  307. except Exception as e:
  308. log_.error(traceback.format_exc())
  309. result = {'code': -1, 'message': 'fail'}
  310. return json.dumps(result)
  311. # 管理后台实时修改rov
  312. @app.route('/applet/video/update/rov', methods=['GET', 'POST'])
  313. def update_rov():
  314. try:
  315. # log_.info({'requestUri': '/applet/video/update/rov', 'request_initial': request.get_data()})
  316. request_data = json.loads(request.get_data())
  317. log_.info({'requestUri': '/applet/video/update/rov',
  318. 'logTimestamp': int(time.time() * 1000),
  319. 'requestData': request_data})
  320. # log_.info('update_rov request data: {}'.format(request_data))
  321. # app_type = request_data.get('appType')
  322. video_id = request_data.get('videoId')
  323. rov_score = request_data.get('rovScore')
  324. redis_helper = RedisHelper()
  325. # 将修改ROV值视频的 videoId 和 rovScore 存入对应的redis中
  326. redis_helper.update_score_with_value(key_name=config_.UPDATE_ROV_KEY_NAME, value=video_id, score=rov_score)
  327. redis_helper.update_score_with_value(key_name=config_.UPDATE_ROV_KEY_NAME_APP, value=video_id, score=rov_score)
  328. # ###### 下线 横屏实验
  329. # # 判断该视频是否为 横屏视频,如果是则 存入rov召回池横屏视频 redis 中
  330. # update_video_w_h_rate(video_id=int(video_id), key_name=config_.W_H_RATE_UP_1_VIDEO_LIST_KEY_NAME['rov_recall'])
  331. result = {'code': 200, 'message': 'update rov success'}
  332. log_.info({'requestUri': '/applet/video/update/rov', 'logTimestamp': int(time.time() * 1000), 'result': result})
  333. # log_.info('result: {}'.format(result))
  334. return json.dumps(result)
  335. except Exception as e:
  336. log_.error(traceback.format_exc())
  337. result = {'code': -1, 'message': 'update rov fail'}
  338. return json.dumps(result)
  339. # 管理后台指定用户恢复成新用户
  340. @app.route('/applet/user/to_new', methods=['GET', 'POST'])
  341. def user_to_new():
  342. try:
  343. request_data = json.loads(request.get_data())
  344. log_.info({'requestUri': '/applet/user/to_new', 'requestData': request_data})
  345. app_type = request_data.get('appType', None)
  346. mid = request_data.get('mid')
  347. uid = request_data.get('uid')
  348. user2new(app_type=app_type, mid=mid, uid=uid)
  349. result = {'code': 200, 'message': 'success'}
  350. log_.info({'requestUri': '/applet/user/to_new', 'result': result})
  351. return json.dumps(result)
  352. except Exception as e:
  353. log_.error(traceback.format_exc())
  354. result = {'code': -1, 'message': 'fail'}
  355. return json.dumps(result)
  356. # 管理后台算法视频列表可视化 - 视频数据表类型获取
  357. @app.route('/applet/video/get_video_type_list', methods=['GET', 'POST'])
  358. def get_video_type_list():
  359. try:
  360. data = [
  361. {'dataListDesc': val.get('dataListDesc'), 'dataListCode': val.get('dataListCode')}
  362. for key, val in config_.VIDEO_DATA_LIST_MAPPING.items()
  363. ]
  364. data.sort(key=lambda x: x['dataListCode'], reverse=False)
  365. result = {'code': 200, 'message': 'success', 'data': data}
  366. return json.dumps(result)
  367. except Exception as e:
  368. log_.error(traceback.format_exc())
  369. result = {'code': -1, 'message': 'fail'}
  370. return json.dumps(result)
  371. # 管理后台算法视频列表可视化 - 获取视频列表
  372. @app.route('/applet/video/get_online_list', methods=['GET', 'POST'])
  373. def get_video_online_list():
  374. try:
  375. request_data = json.loads(request.get_data())
  376. ab_exp_code = request_data.get('abExpCode', None)
  377. search_time = request_data.get('searchTime', None)
  378. data_list_type = request_data.get('dataListType', None)
  379. region_code = request_data.get('regionCode', None)
  380. video_id = request_data.get('videoId', None)
  381. page_num = request_data.get('pageNum', 1)
  382. page_size = request_data.get('pageSize', 100)
  383. if video_id is None:
  384. result = get_video_list(ab_exp_code=ab_exp_code, search_time=search_time, data_list_type=data_list_type,
  385. region_code=region_code, page_num=page_num, page_size=page_size)
  386. else:
  387. result = search_video(ab_exp_code=ab_exp_code, search_time=search_time, data_list_type=data_list_type,
  388. region_code=region_code, video_id=video_id, page_num=page_num, page_size=page_size)
  389. return json.dumps(result)
  390. except Exception as e:
  391. log_.error(traceback.format_exc())
  392. result = {'code': -1, 'message': 'fail'}
  393. return json.dumps(result)
  394. # 广告推荐
  395. @app.route('/applet/ad/predict', methods=['GET', 'POST'])
  396. def ad_predict():
  397. start_time = time.time()
  398. try:
  399. request_data = json.loads(request.get_data())
  400. mid = request_data.get('mid')
  401. video_id = request_data.get('videoId')
  402. app_type = request_data.get('appType')
  403. ab_exp_info = request_data.get('abExpInfo')
  404. ab_test_code = request_data.get('abTestCode')
  405. care_model_status = request_data.get('careModelStatus', 1) # 用户关怀模式状态 1: 未开启,2: 开启, 默认: 1
  406. predict_result = ad_recommend_predict(app_type=app_type,
  407. mid=mid,
  408. video_id=video_id,
  409. ab_exp_info=ab_exp_info,
  410. ab_test_code=ab_test_code,
  411. care_model_status=care_model_status)
  412. if predict_result is None:
  413. result = {'code': -1, 'message': 'fail'}
  414. else:
  415. result = {'code': 200, 'message': 'success', 'data': predict_result.get('ad_predict')}
  416. log_message = {
  417. 'requestUri': '/applet/ad/predict',
  418. 'request_data': request_data,
  419. 'logTimestamp': int(time.time() * 1000),
  420. 'app_type': app_type,
  421. 'mid': mid,
  422. 'video_id': video_id,
  423. 'predict_result': predict_result,
  424. 'result': result,
  425. 'executeTime': (time.time() - start_time) * 1000
  426. }
  427. log_.info(log_message)
  428. return json.dumps(result)
  429. except Exception as e:
  430. log_.error(traceback.format_exc())
  431. result = {'code': -1, 'message': 'fail'}
  432. return json.dumps(result)
  433. # 广告推荐新策略
  434. @app.route('/applet/ad/roi/predict', methods=['GET', 'POST'])
  435. def ad_roi_predict():
  436. start_time = time.time()
  437. try:
  438. request_data = json.loads(request.get_data())
  439. mid = request_data.get('mid')
  440. video_id = request_data.get('videoId')
  441. app_type = request_data.get('appType')
  442. ads = request_data.get('ads')
  443. predict_result = ad_recommend_predict_with_roi(app_type=app_type,
  444. mid=mid,
  445. video_id=video_id,
  446. ads=ads,
  447. arpu=ad_arpu,
  448. roi_param=ad_roi_param)
  449. if predict_result is None:
  450. result = {'code': -1, 'message': 'fail'}
  451. else:
  452. result = {
  453. 'code': 200,
  454. 'message': 'success',
  455. 'data': {
  456. 'adId': predict_result.get('ad_id'),
  457. 'adRes': predict_result.get('ad_predict')
  458. }
  459. }
  460. log_message = {
  461. 'requestUri': '/applet/ad/roi/predict',
  462. 'request_data': request_data,
  463. 'logTimestamp': int(time.time() * 1000),
  464. 'app_type': app_type,
  465. 'mid': mid,
  466. 'video_id': video_id,
  467. 'predict_result': predict_result,
  468. 'result': result,
  469. 'executeTime': (time.time() - start_time) * 1000
  470. }
  471. log_.info(log_message)
  472. return json.dumps(result)
  473. except Exception as e:
  474. log_.error(traceback.format_exc())
  475. result = {'code': -1, 'message': 'fail'}
  476. return json.dumps(result)
  477. # app热榜
  478. @app.route('/app/video/hot_list', methods=['GET', 'POST'])
  479. def app_video_hot_list():
  480. try:
  481. page_size = 10
  482. request_data = request.get_data()
  483. request_data = json.loads(request_data)
  484. page = request_data.get('page', 0)
  485. log_.info({'requestUri': '/app/video/hot_lis', 'requestData': request_data})
  486. # log_.info('app_video_hot_list request data: {}'.format(request_data))
  487. redis_helper = RedisHelper()
  488. datas = redis_helper.get_data_from_redis('app_video_hot_list')
  489. if datas is None or len(datas) == 0:
  490. result = {'code': -1, 'message': 'no data'}
  491. log_.info({'requestUri': '/app/video/hot_lis', 'result': result})
  492. # log_.info('result: {}'.format(result))
  493. return json.dumps(result)
  494. datas = ast.literal_eval(datas)
  495. total_page = int(len(datas)/page_size)
  496. if len(datas)%page_size > 0:
  497. total_page += 1
  498. if page > total_page -1 :
  499. result = {'code': -1, 'message': 'page exceed max'}
  500. log_.info({'requestUri': '/app/video/hot_lis', 'result': result})
  501. # log_.info('result: {}'.format(result))
  502. return json.dumps(result)
  503. result = {'code': 200, 'message': '', 'data': {'total_page': total_page,
  504. 'hot_list': datas[page*page_size:page*page_size+page_size]}}
  505. log_.info({'requestUri': '/app/video/hot_lis', 'result': result})
  506. # log_.info('result: {}'.format(result))
  507. return json.dumps(result)
  508. except Exception as e:
  509. log_.error(e)
  510. # print(traceback.format_exc())
  511. result = {'code': -1, 'message': 'fail'}
  512. return json.dumps(result)
  513. def serve_forever(ip='0.0.0.0', port=5001):
  514. pywsgi.WSGIServer((ip, port), app).serve_forever()
  515. def apprun(MULTI_PROCESS=True, ip='0.0.0.0', port=5001):
  516. if MULTI_PROCESS == False:
  517. WSGIServer((ip, port), app).serve_forever()
  518. else:
  519. # mulserver = WSGIServer((ip, port), app, handler_class=WebSocketHandler)
  520. mulserver = WSGIServer((ip, port), app)
  521. mulserver.start()
  522. def server_forever():
  523. mulserver.start_accepting()
  524. mulserver._stop_event.wait()
  525. #for i in range(cpu_count()):
  526. for i in range(20):
  527. p = Process(target=server_forever)
  528. p.start()
  529. if __name__ == '__main__':
  530. app.run()
  531. #server = pywsgi.WSGIServer(('0.0.0.0', 5000), app)
  532. #server.serve_forever()
  533. # apprun()