app.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  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. env_dict['cityCode'] = client_info.get('cityCode', '-1')
  122. except:
  123. env_dict['app_type'] = 4
  124. env_dict['pagesource'] = str(pagesource)
  125. env_dict['versioncode'] = 0
  126. env_dict['machineinfo_brand'] = str(machineinfoBrand)
  127. env_dict['machineinfo_model'] = str(machineinfoModel)
  128. env_dict['machineinfo_platform'] = str(machineinfoPlatform)
  129. env_dict['recommendsource'] = str(recommendsource)
  130. env_dict['sencetype'] = sencetype
  131. env_dict['hotSenceType'] = int(hotSenceType)
  132. env_dict['recomTraceId'] = recomTraceId
  133. env_dict['recomInterface'] = "homepage"
  134. env_dict['cityCode'] = client_info.get('cityCode', '-1')
  135. log_.error("feature error",env_dict)
  136. params = Params(request_id=request_id)
  137. # size默认为10
  138. if not size:
  139. size = 10
  140. if category_id in config_.CATEGORY['recommend']:
  141. # 推荐
  142. recommend_result = video_homepage_recommend(
  143. request_id=request_id,
  144. mid=mid,
  145. uid=uid,
  146. size=size,
  147. app_type=app_type,
  148. algo_type=algo_type,
  149. client_info=client_info,
  150. ab_exp_info=ab_exp_info,
  151. params=params,
  152. ab_info_data=ab_info_data,
  153. version_audit_status=version_audit_status,
  154. env_dict=env_dict,
  155. level_weight=level_weight,
  156. flow_pool_abtest_config=flow_pool_abtest_config
  157. )
  158. result = {'code': 200, 'message': 'success', 'data': {'videos': recommend_result['videos']}}
  159. log_message = {
  160. 'requestUri': '/applet/video/homepage/recommend',
  161. 'logTimestamp': int(time.time() * 1000),
  162. 'request_id': request_id,
  163. 'app_type': app_type,
  164. 'client_info': client_info,
  165. 'ab_exp_info': ab_exp_info,
  166. 'ab_info_data': ab_info_data,
  167. 'version_audit_status': version_audit_status,
  168. 'category_id': category_id,
  169. 'mid': mid,
  170. 'uid': uid,
  171. 'getRecommendParamsTime': recommend_result.get('getRecommendParamsTime', ''),
  172. 'getRecommendResultTime': recommend_result.get('getRecommendResultTime', ''),
  173. 'updateRedisDataTime': recommend_result.get('updateRedisDataTime', ''),
  174. 'recommendOperation': recommend_result.get('recommendOperation', ''),
  175. 'result': result,
  176. 'executeTime': (time.time() - start_time) * 1000,
  177. 'fea_info': recommend_result.get('fea_info', {})
  178. }
  179. log_.info(log_message)
  180. # log_.info('category_id: {}, mid: {}, uid: {}, result: {}, execute time = {}ms'.format(
  181. # category_id, mid, uid, result, (time.time() - start_time)*1000))
  182. return json.dumps(result)
  183. elif category_id in config_.CATEGORY['other']:
  184. # 其他类别
  185. videos = get_category_videos()
  186. result = {'code': 200, 'message': 'success', 'data': {'videos': videos}}
  187. log_.info('category_id: {}, mid: {}, uid: {}, result: {}, execute time = {}ms'.format(
  188. category_id, mid, uid, result, (time.time() - start_time) * 1000))
  189. return json.dumps(result)
  190. else:
  191. log_.error('categoryId error, categoryId = {}'.format(category_id))
  192. result = {'code': -1, 'message': 'categoryId error'}
  193. return json.dumps(result)
  194. except Exception as e:
  195. log_.error(traceback.format_exc())
  196. result = {'code': -1, 'message': 'fail'}
  197. return json.dumps(result)
  198. # 相关推荐
  199. @app.route('/applet/video/relevant/recommend', methods=['GET', 'POST'])
  200. def relevant_recommend():
  201. start_time = time.time()
  202. # in_relevant = start_time * 1000 + random.randint(0, 100)
  203. # log_.info({"type": "relevant", "in_relevant": in_relevant})
  204. try:
  205. global level_weight
  206. request_data = json.loads(request.get_data())
  207. request_id = request_data.get('requestId')
  208. # log_.info({
  209. # 'logTimestamp': int(time.time() * 1000),
  210. # 'request_id': request_id,
  211. # 'in_relevant': in_relevant,
  212. # 'type': "relevant_recommend",
  213. # 'text': 'in relevant_recommend',
  214. # 'executeTime': (time.time() - start_time) * 1000
  215. # })
  216. mid = request_data.get('mid')
  217. uid = request_data.get('uid')
  218. video_id = request_data.get('videoId')
  219. # up_uid = request_data.get('upUid')
  220. # share_mid = request_data.get('shareMid')
  221. # share_uid = request_data.get('shareUid')
  222. # page_num = request_data.get('pageNum', 1)
  223. page_size = request_data.get('pageSize', 4)
  224. app_type = request_data.get('appType')
  225. client_info = request_data.get('clientInfo')
  226. ab_exp_info = request_data.get('abExpInfo', None)
  227. page_type = request_data.get('pageType') # 1:详情页;2:分享页
  228. ab_info_data = request_data.get('abInfoData', None)
  229. version_audit_status = request_data.get('versionAuditStatus', 2) # 小程序版本审核参数:1-审核中,2-审核通过,默认:2
  230. machineinfoBrand = request_data.get('machineinfoBrand', '')
  231. machineinfoModel = request_data.get('machineinfoModel', '')
  232. machineinfoPlatform = request_data.get('machineinfoPlatform', '')
  233. pagesource = request_data.get('pageSource', '')
  234. versioncode = request_data.get('versionCode', 0)
  235. recommendsource = request_data.get('recommendSource', '0')
  236. sencetype = request_data.get('senceType', 0)
  237. hotSenceType = request_data.get('hotSenceType', 0)
  238. recomTraceId = request_data.get('recomTraceId', "")
  239. env_dict = {}
  240. try:
  241. env_dict['app_type'] = int(app_type)
  242. env_dict['pagesource'] = str(pagesource)
  243. env_dict['versioncode'] = int(versioncode)
  244. env_dict['machineinfo_brand'] = str(machineinfoBrand)
  245. env_dict['machineinfo_model'] = str(machineinfoModel)
  246. env_dict['machineinfo_platform'] = str(machineinfoPlatform)
  247. env_dict['recommendsource'] = str(recommendsource)
  248. env_dict['sencetype'] = int(sencetype)
  249. env_dict['hotSenceType'] = int(hotSenceType)
  250. env_dict['recomInterface'] = "relevant_recommend"
  251. env_dict['recomTraceId'] = recomTraceId
  252. env_dict['relevant_video_id'] = video_id
  253. env_dict['cityCode'] = client_info.get('cityCode', '-1')
  254. except:
  255. env_dict['app_type'] = 4
  256. env_dict['pagesource'] = str(pagesource)
  257. env_dict['versioncode'] = 0
  258. env_dict['machineinfo_brand'] = str(machineinfoBrand)
  259. env_dict['machineinfo_model'] = str(machineinfoModel)
  260. env_dict['machineinfo_platform'] = str(machineinfoPlatform)
  261. env_dict['recommendsource'] = str(recommendsource)
  262. env_dict['sencetype'] = sencetype
  263. env_dict['hotSenceType'] = int(hotSenceType)
  264. env_dict['recomInterface'] = "relevant_recommend"
  265. env_dict['relevant_video_id'] = video_id
  266. env_dict['recomTraceId'] = recomTraceId
  267. env_dict['cityCode'] = client_info.get('cityCode', '-1')
  268. log_.error("feature error", env_dict)
  269. params = Params(request_id=request_id)
  270. recommend_result = video_relevant_recommend(
  271. request_id=request_id,
  272. video_id=video_id,
  273. mid=mid,
  274. uid=uid,
  275. size=page_size,
  276. app_type=app_type,
  277. ab_exp_info=ab_exp_info,
  278. client_info=client_info,
  279. page_type=page_type,
  280. params=params,
  281. ab_info_data=ab_info_data,
  282. version_audit_status=version_audit_status,
  283. env_dict=env_dict,
  284. level_weight=level_weight,
  285. flow_pool_abtest_config=flow_pool_abtest_config
  286. )
  287. result = {'code': 200, 'message': 'success', 'data': {'videos': recommend_result['videos']}}
  288. log_message = {
  289. 'requestUri': '/applet/video/relevant/recommend',
  290. 'logTimestamp': int(time.time() * 1000),
  291. 'request_id': request_id,
  292. 'app_type': app_type,
  293. 'client_info': client_info,
  294. 'ab_exp_info': ab_exp_info,
  295. 'ab_info_data': ab_info_data,
  296. 'version_audit_status': version_audit_status,
  297. 'mid': mid,
  298. 'uid': uid,
  299. 'getRecommendParamsTime': recommend_result.get('getRecommendParamsTime', ''),
  300. 'getRecommendResultTime': recommend_result.get('getRecommendResultTime', ''),
  301. 'updateRedisDataTime': recommend_result.get('updateRedisDataTime', ''),
  302. 'recommendOperation': recommend_result.get('recommendOperation', ''),
  303. 'result': result,
  304. 'executeTime': (time.time() - start_time) * 1000,
  305. 'fea_info': recommend_result.get('fea_info', {})
  306. }
  307. log_.info(log_message)
  308. # log_.info('app_type: {}, mid: {}, uid: {}, relevant-result: {}, execute time = {}ms'.format(
  309. # app_type, mid, uid, result, (time.time() - start_time) * 1000))
  310. return json.dumps(result)
  311. except Exception as e:
  312. log_.error(traceback.format_exc())
  313. result = {'code': -1, 'message': 'fail'}
  314. return json.dumps(result)
  315. # 管理后台实时修改rov
  316. @app.route('/applet/video/update/rov', methods=['GET', 'POST'])
  317. def update_rov():
  318. try:
  319. # log_.info({'requestUri': '/applet/video/update/rov', 'request_initial': request.get_data()})
  320. request_data = json.loads(request.get_data())
  321. log_.info({'requestUri': '/applet/video/update/rov',
  322. 'logTimestamp': int(time.time() * 1000),
  323. 'requestData': request_data})
  324. # log_.info('update_rov request data: {}'.format(request_data))
  325. # app_type = request_data.get('appType')
  326. video_id = request_data.get('videoId')
  327. rov_score = request_data.get('rovScore')
  328. redis_helper = RedisHelper()
  329. # 将修改ROV值视频的 videoId 和 rovScore 存入对应的redis中
  330. redis_helper.update_score_with_value(key_name=config_.UPDATE_ROV_KEY_NAME, value=video_id, score=rov_score)
  331. redis_helper.update_score_with_value(key_name=config_.UPDATE_ROV_KEY_NAME_APP, value=video_id, score=rov_score)
  332. # ###### 下线 横屏实验
  333. # # 判断该视频是否为 横屏视频,如果是则 存入rov召回池横屏视频 redis 中
  334. # update_video_w_h_rate(video_id=int(video_id), key_name=config_.W_H_RATE_UP_1_VIDEO_LIST_KEY_NAME['rov_recall'])
  335. result = {'code': 200, 'message': 'update rov success'}
  336. log_.info({'requestUri': '/applet/video/update/rov', 'logTimestamp': int(time.time() * 1000), 'result': result})
  337. # log_.info('result: {}'.format(result))
  338. return json.dumps(result)
  339. except Exception as e:
  340. log_.error(traceback.format_exc())
  341. result = {'code': -1, 'message': 'update rov fail'}
  342. return json.dumps(result)
  343. # 管理后台指定用户恢复成新用户
  344. @app.route('/applet/user/to_new', methods=['GET', 'POST'])
  345. def user_to_new():
  346. try:
  347. request_data = json.loads(request.get_data())
  348. log_.info({'requestUri': '/applet/user/to_new', 'requestData': request_data})
  349. app_type = request_data.get('appType', None)
  350. mid = request_data.get('mid')
  351. uid = request_data.get('uid')
  352. user2new(app_type=app_type, mid=mid, uid=uid)
  353. result = {'code': 200, 'message': 'success'}
  354. log_.info({'requestUri': '/applet/user/to_new', 'result': result})
  355. return json.dumps(result)
  356. except Exception as e:
  357. log_.error(traceback.format_exc())
  358. result = {'code': -1, 'message': 'fail'}
  359. return json.dumps(result)
  360. # 管理后台算法视频列表可视化 - 视频数据表类型获取
  361. @app.route('/applet/video/get_video_type_list', methods=['GET', 'POST'])
  362. def get_video_type_list():
  363. try:
  364. data = [
  365. {'dataListDesc': val.get('dataListDesc'), 'dataListCode': val.get('dataListCode')}
  366. for key, val in config_.VIDEO_DATA_LIST_MAPPING.items()
  367. ]
  368. data.sort(key=lambda x: x['dataListCode'], reverse=False)
  369. result = {'code': 200, 'message': 'success', 'data': data}
  370. return json.dumps(result)
  371. except Exception as e:
  372. log_.error(traceback.format_exc())
  373. result = {'code': -1, 'message': 'fail'}
  374. return json.dumps(result)
  375. # 管理后台算法视频列表可视化 - 获取视频列表
  376. @app.route('/applet/video/get_online_list', methods=['GET', 'POST'])
  377. def get_video_online_list():
  378. try:
  379. request_data = json.loads(request.get_data())
  380. ab_exp_code = request_data.get('abExpCode', None)
  381. search_time = request_data.get('searchTime', None)
  382. data_list_type = request_data.get('dataListType', None)
  383. region_code = request_data.get('regionCode', None)
  384. video_id = request_data.get('videoId', None)
  385. page_num = request_data.get('pageNum', 1)
  386. page_size = request_data.get('pageSize', 100)
  387. if video_id is None:
  388. result = get_video_list(ab_exp_code=ab_exp_code, search_time=search_time, data_list_type=data_list_type,
  389. region_code=region_code, page_num=page_num, page_size=page_size)
  390. else:
  391. result = search_video(ab_exp_code=ab_exp_code, search_time=search_time, data_list_type=data_list_type,
  392. region_code=region_code, video_id=video_id, page_num=page_num, page_size=page_size)
  393. return json.dumps(result)
  394. except Exception as e:
  395. log_.error(traceback.format_exc())
  396. result = {'code': -1, 'message': 'fail'}
  397. return json.dumps(result)
  398. # 广告推荐
  399. @app.route('/applet/ad/predict', methods=['GET', 'POST'])
  400. def ad_predict():
  401. start_time = time.time()
  402. try:
  403. request_data = json.loads(request.get_data())
  404. mid = request_data.get('mid')
  405. video_id = request_data.get('videoId')
  406. app_type = request_data.get('appType')
  407. ab_exp_info = request_data.get('abExpInfo')
  408. ab_test_code = request_data.get('abTestCode')
  409. care_model_status = request_data.get('careModelStatus', 1) # 用户关怀模式状态 1: 未开启,2: 开启, 默认: 1
  410. predict_result = ad_recommend_predict(app_type=app_type,
  411. mid=mid,
  412. video_id=video_id,
  413. ab_exp_info=ab_exp_info,
  414. ab_test_code=ab_test_code,
  415. care_model_status=care_model_status)
  416. if predict_result is None:
  417. result = {'code': -1, 'message': 'fail'}
  418. else:
  419. result = {'code': 200, 'message': 'success', 'data': predict_result.get('ad_predict')}
  420. log_message = {
  421. 'requestUri': '/applet/ad/predict',
  422. 'request_data': request_data,
  423. 'logTimestamp': int(time.time() * 1000),
  424. 'app_type': app_type,
  425. 'mid': mid,
  426. 'video_id': video_id,
  427. 'predict_result': predict_result,
  428. 'result': result,
  429. 'executeTime': (time.time() - start_time) * 1000
  430. }
  431. log_.info(log_message)
  432. return json.dumps(result)
  433. except Exception as e:
  434. log_.error(traceback.format_exc())
  435. result = {'code': -1, 'message': 'fail'}
  436. return json.dumps(result)
  437. # 广告推荐新策略
  438. @app.route('/applet/ad/roi/predict', methods=['GET', 'POST'])
  439. def ad_roi_predict():
  440. start_time = time.time()
  441. try:
  442. request_data = json.loads(request.get_data())
  443. mid = request_data.get('mid')
  444. video_id = request_data.get('videoId')
  445. app_type = request_data.get('appType')
  446. ads = request_data.get('ads')
  447. predict_result = ad_recommend_predict_with_roi(app_type=app_type,
  448. mid=mid,
  449. video_id=video_id,
  450. ads=ads,
  451. arpu=ad_arpu,
  452. roi_param=ad_roi_param)
  453. if predict_result is None:
  454. result = {'code': -1, 'message': 'fail'}
  455. else:
  456. result = {
  457. 'code': 200,
  458. 'message': 'success',
  459. 'data': {
  460. 'adId': predict_result.get('ad_id'),
  461. 'adRes': predict_result.get('ad_predict')
  462. }
  463. }
  464. log_message = {
  465. 'requestUri': '/applet/ad/roi/predict',
  466. 'request_data': request_data,
  467. 'logTimestamp': int(time.time() * 1000),
  468. 'app_type': app_type,
  469. 'mid': mid,
  470. 'video_id': video_id,
  471. 'predict_result': predict_result,
  472. 'result': result,
  473. 'executeTime': (time.time() - start_time) * 1000
  474. }
  475. log_.info(log_message)
  476. return json.dumps(result)
  477. except Exception as e:
  478. log_.error(traceback.format_exc())
  479. result = {'code': -1, 'message': 'fail'}
  480. return json.dumps(result)
  481. # app热榜
  482. @app.route('/app/video/hot_list', methods=['GET', 'POST'])
  483. def app_video_hot_list():
  484. try:
  485. page_size = 10
  486. request_data = request.get_data()
  487. request_data = json.loads(request_data)
  488. page = request_data.get('page', 0)
  489. log_.info({'requestUri': '/app/video/hot_lis', 'requestData': request_data})
  490. # log_.info('app_video_hot_list request data: {}'.format(request_data))
  491. redis_helper = RedisHelper()
  492. datas = redis_helper.get_data_from_redis('app_video_hot_list')
  493. if datas is None or len(datas) == 0:
  494. result = {'code': -1, 'message': 'no data'}
  495. log_.info({'requestUri': '/app/video/hot_lis', 'result': result})
  496. # log_.info('result: {}'.format(result))
  497. return json.dumps(result)
  498. datas = ast.literal_eval(datas)
  499. total_page = int(len(datas)/page_size)
  500. if len(datas)%page_size > 0:
  501. total_page += 1
  502. if page > total_page -1 :
  503. result = {'code': -1, 'message': 'page exceed max'}
  504. log_.info({'requestUri': '/app/video/hot_lis', 'result': result})
  505. # log_.info('result: {}'.format(result))
  506. return json.dumps(result)
  507. result = {'code': 200, 'message': '', 'data': {'total_page': total_page,
  508. 'hot_list': datas[page*page_size:page*page_size+page_size]}}
  509. log_.info({'requestUri': '/app/video/hot_lis', 'result': result})
  510. # log_.info('result: {}'.format(result))
  511. return json.dumps(result)
  512. except Exception as e:
  513. log_.error(e)
  514. # print(traceback.format_exc())
  515. result = {'code': -1, 'message': 'fail'}
  516. return json.dumps(result)
  517. def serve_forever(ip='0.0.0.0', port=5001):
  518. pywsgi.WSGIServer((ip, port), app).serve_forever()
  519. def apprun(MULTI_PROCESS=True, ip='0.0.0.0', port=5001):
  520. if MULTI_PROCESS == False:
  521. WSGIServer((ip, port), app).serve_forever()
  522. else:
  523. # mulserver = WSGIServer((ip, port), app, handler_class=WebSocketHandler)
  524. mulserver = WSGIServer((ip, port), app)
  525. mulserver.start()
  526. def server_forever():
  527. mulserver.start_accepting()
  528. mulserver._stop_event.wait()
  529. #for i in range(cpu_count()):
  530. for i in range(20):
  531. p = Process(target=server_forever)
  532. p.start()
  533. if __name__ == '__main__':
  534. app.run()
  535. #server = pywsgi.WSGIServer(('0.0.0.0', 5000), app)
  536. #server.serve_forever()
  537. # apprun()