Covid19case:英文版全球疫情图部分开发笔记

全球疫情愈加严重,关注度越来越高。实际上开源社区对越这次疫情的参与也是非常积极的,有很多项目都可以拿来学习或参与其中。这次分享的是英文版疫情开发的一些经验。

预览地址: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 主要是针对最基础的元素【字符串、数字、列表、字典】去操作的,因此逻辑处理上比较顺畅。相对于前端的永无止境的美化,后端最终只有几张表展现,因此维护和开发相对迅速。

联系方式
广告
网站统计

累计发布:211 篇

总点赞量:1322

累计运行:5 年 197 天

建站日期:2018-10-25