全球疫情愈加严重,关注度越来越高。实际上开源社区对越这次疫情的参与也是非常积极的,有很多项目都可以拿来学习或参与其中。这次分享的是英文版疫情开发的一些经验。
预览地址:https://www.covid19case.com
0.最终效果
1.主要技术栈
-
前端:VUE+echrt.js
-
后端:flask+mysql+docker
2.后端开发笔记
- 问题 1:flask 调用数据库,如果非常频繁会导致访问异常,需要添加一个 roolback()
def query_record(query_sql):
try:
result = session.execute(query_sql)
session.commit()
except SQLAlchemyError as e:
session.rollback()
#print("we have error in add_costumer, {}".format(e))
result = session.execute(query_sql)
session.commit()
return result
- 问题 2:处理动态页面请求时,比如 vue 开发的疫情图,像百度那样数据都在 js 文件里,无法用 requests 获得,后来使用 urllib3 就可以完整的获取到。
http = urllib3.PoolManager()
r = http.request('GET', 'https://voice.baidu.com/act/newpneumonia/newpneumonia')
r.data
-
问题 3:处理"\u"开头的字符串时,我以为转换为 str 类型后,用 replace 替换就行,结果试了多次无果。
比如:
\\u8868\\u53551
中将双\
变成单\
。无法用 replace.最终需要用unicode_escape
的编码方法去解决a = '\\u8868\\u53551' a.encode('utf-8').decode('unicode_escape')
-
问题 4:多个列表之间带序列编号的操作
list_a = [4,1,5,3] list_b = [5,2,6,1] for i,(x,y) in enumerate(zip(list_a,list_b)): # # 其中i代表序列号,从0开始,x,y代表列表里的值。如果有第三个列表,可以写成如下 for i,(x,y,z) in enumerate(zip(list_a,list_b,list_c)): #
-
问题 5:列表去重,直接使用用 set,原先的排序会打乱,再次使用 sort 可以保留原始排序
>liast_a = [5,6,6,4,4,1] >result = list(set(liast_a)) #去重无序结果 >result.sort(key=liast_a.index) #按原来排序 最终输出:[5,6,4,1]
最好在加个 TG 通知的,用于异常提醒
from requests import post """ TG 消息推送 """ TG_TOKEN = 'XXXXXXXXXXXXXXXXXXXXX' CHAT_ID = 'XXXXXXXXX' def post_tg(message): telegram_message = f"{message}" params = ( ('chat_id', CHAT_ID), ('text', telegram_message), ('parse_mode', "Markdown"), #可选Html或Markdown ('disable_web_page_preview', "yes") ) telegram_url = "https://api.telegram.org/bot" + TG_TOKEN + "/sendMessage" telegram_req = post(telegram_url, params=params) telegram_status = telegram_req.status_code if telegram_status == 200: print(f"INFO: Telegram Message sent") else: print("Telegram Error") if __name__ == "__main__": post_tg('你好,佰阅!')
3.一些感悟
本项目是聂老板主持开发的,虽然不清楚最终能否通过赞助费获得实际收益,但是开发这个比之前自己开发的疫情图要漫长的多。基于 pyechart 的基本一天就可以完工,基于 flask+mysql+echart 的前端,当时花了 2 天左右,而这个虽然有前面的积累,但是维护这块耗时却很大。看来一个项目要想持续运作,必须要连续不断的去处理异常,否则无法顺产。
由于 python 是一门解释型语言,所以代码书写的时候,感觉写起来越来越顺畅,这也是 python 的优势,不像 php 那样,让你前仆后继,很耗耐心。python 主要是针对最基础的元素【字符串、数字、列表、字典】去操作的,因此逻辑处理上比较顺畅。相对于前端的永无止境的美化,后端最终只有几张表展现,因此维护和开发相对迅速。