Python mini-web框架5:路由添加正則和log日志功能

一硅卢、給路由添加正則表達(dá)式

  • 給路由參數(shù)添加正則表達(dá)式的原因:在實(shí)際開(kāi)發(fā)時(shí)霜大,url中往往會(huì)帶有很多的參數(shù),例如:/add/0003.html 中0003 就是參數(shù)底燎,如果沒(méi)有正則的話(huà)鳖粟,那么就需要編寫(xiě) N@route 來(lái)進(jìn)行添加 url 對(duì)應(yīng)的函數(shù)到字典中社裆,此時(shí)字典中的鍵值對(duì)有 N 個(gè),浪費(fèi)空間向图,而采用了正則的話(huà),那么只要編寫(xiě)1@route 就可以完成多個(gè) url 例如/add/0008.html泳秀、/add/0003.html 等對(duì)同一個(gè)函數(shù),此時(shí)的字典中鍵值對(duì)減少很多榄攀,如下示例代碼

    import re
    from pymysql import connect
    
    # 定義一個(gè)空子典
    URL_FUNC_DICT = dict()
    
    
    def route(url):
            """
            帶參數(shù)的裝飾器來(lái)做路由
            :param url: 請(qǐng)求的url
            :return: 返回一個(gè)裝飾器
            """
            def set_func(func):
                # 往空子典里面添加元素
                URL_FUNC_DICT[url] = func
    
                def call_func(*args, **kwargs):
                         return func(*args, **kwargs)
    
                return call_func
    
            return set_func
    
    
    @route(r"/add/(\d+)\.html")
    def add_focus(ret):
    
           # 1.獲取股票代碼
           stock_code = ret.group(1)
    
           # 2.判斷下是否有這個(gè)股票代碼
           # 創(chuàng)建Connection連接
           conn = connect(host='域名或者公網(wǎng)IP', port=3306, database='數(shù)據(jù)庫(kù)名', user='用戶(hù)名', password='密碼',
                 charset='utf8')
           # 獲得Cursor對(duì)象
           cursor = conn.cursor()
           sql = """select * from info where code=%s;"""
           cursor.execute(sql,(stock_code,))
    
           print("************-----------1------------------")
    
           # 如果要是沒(méi)有這個(gè)股票代碼嗜傅,那么就認(rèn)為是非法的請(qǐng)求
           if not cursor.fetchone():
                cursor.close()
                conn.close()
                return "沒(méi)有這支股票,大哥 檩赢,我們是創(chuàng)業(yè)公司吕嘀,請(qǐng)手下留情..."
    
           print("************-----------2------------------")
    
           # 3.在股票存在的情況下查看股票是否關(guān)注過(guò)
           sql = """select * from focus as f inner join info as i on f.info_id = i.id where i.code=%s;"""
           cursor.execute(sql,(stock_code,))
           # 如果查出來(lái)表示關(guān)注過(guò)
           if cursor.fetchone():
                 cursor.close()
                 conn.close()
                 return "已經(jīng)關(guān)注過(guò)了,請(qǐng)勿重復(fù)關(guān)注..."
    
           print("************-----------3------------------")
    
          # 4.在沒(méi)有關(guān)注的情況下贞瞒,進(jìn)行關(guān)注偶房,也就是往關(guān)注的信息表里面添加數(shù)據(jù)
          sql = """insert into focus (info_id) select id from info where code = %s;"""
          cursor.execute(sql,(stock_code,))
          conn.commit()
          cursor.close()
          conn.close()
    
          return "關(guān)注成功"
    
    
    def application(evn, start_reponse):
            start_reponse('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
            file_name = evn['PATH_INFO']
            try:
                for url,func in URL_FUNC_DICT.items():
                       ret = re.match(url,file_name)
                       if ret:
                             return func(ret)
                       else:
                             return "請(qǐng)求的url(%s)沒(méi)有對(duì)應(yīng)的函數(shù)...." % file_name
    
            except Exception as ret:
                 return "產(chǎn)生了異常:%s"% str(ret)
    

二、url 編碼

  • 2.1憔狞、python3對(duì)url編解碼
    導(dǎo)入庫(kù) urllib.parse

    import urllib.parse
    

    Python3 url編碼

    print(urllib.parse.quote("不忘初心蝴悉,方得始終!"))
    打印結(jié)果:%E4%B8%8D%E5%BF%98%E5%88%9D%E5%BF%83%EF%BC%8C%E6%96%B9%E5%BE%97%E5%A7%8B%E7%BB%88%EF%BC%81
    

    Python3 url解碼

    print(urllib.parse.unquote('%E4%B8%8D%E5%BF%98%E5%88%9D%E5%BF%83%EF%BC%8C%E6%96%B9%E5%BE%97%E5%A7%8B%E7%BB%88%EF%BC%81'))
    打印結(jié)果是:不忘初心瘾敢,方得始終!
    

    完整的代碼如下:

    import urllib.parse
    
    text = urllib.parse.quote("不忘初心,方得始終簇抵!")
    
    print("url編碼后的文字=%s"%text)
    
    text = urllib.parse.unquote(text)
    
    print("url解碼后的文字=%s"%text)
    
  • 2.2庆杜、瀏覽器往服務(wù)器傳內(nèi)容的時(shí)候會(huì)對(duì)內(nèi)容進(jìn)行編碼,如果我們的框架在接收到消息后不進(jìn)行解碼直接寫(xiě)入數(shù)據(jù)庫(kù)碟摆,我們服務(wù)器里面存的是url編碼的內(nèi)容晃财,所以我們需要對(duì)內(nèi)容進(jìn)行解碼,再存到數(shù)據(jù)庫(kù)典蜕,這樣下次讀取出來(lái)的時(shí)候不再是url編碼的內(nèi)容

三断盛、logging日志模塊

  • 3.1、開(kāi)發(fā)過(guò)程中出現(xiàn)bug是必不可免的愉舔,你會(huì)怎樣debug钢猛?從第1行代碼開(kāi)始看么?還是有個(gè)文件里面記錄著哪里錯(cuò)了更方便呢P汀C酢!log日志火的,Python中有個(gè)logging模塊可以完成相關(guān)信息的記錄壶愤,在debug時(shí)用它往往事半功倍

  • 3.2、日志級(jí)別:日志一共分成5個(gè)等級(jí)馏鹤,從 低到高 分別是:

    DEBUG      # 調(diào)試模式
    INFO       # 確認(rèn)一切按預(yù)期運(yùn)行
    WARNING    # 警告
    ERROR      # 錯(cuò)誤
    CRITICAL   # critical 英[?kr?t?kl]  嚴(yán)重的;
    

    解釋?zhuān)?/p>

    • DEBUG:詳細(xì)的信息,通常只出現(xiàn)在診斷問(wèn)題上
    • INFO:確認(rèn)一切按預(yù)期運(yùn)行
    • WARNING:一個(gè)跡象表明,一些意想不到的事情發(fā)生了,或表明一些問(wèn)題在不久的將來(lái)(例如征椒。磁盤(pán)空間低”)。這個(gè)軟件還能按預(yù)期工作湃累。
    • ERROR:更嚴(yán)重的問(wèn)題,軟件沒(méi)能執(zhí)行一些功能
    • CRITICAL:一個(gè)嚴(yán)重的錯(cuò)誤,這表明程序本身可能無(wú)法繼續(xù)運(yùn)行
    • 總結(jié):這5個(gè)等級(jí)勃救,也分別對(duì)應(yīng)5種打日志的方法: debug 、info 脱茉、warning 剪芥、error 、critical琴许。默認(rèn)的是WARNING税肪,當(dāng)在WARNING或之上時(shí)才被跟蹤。
  • 3.3榜田、日志輸出
    有兩種方式記錄跟蹤益兄,一種輸出控制臺(tái),另一種是記錄到文件中箭券,如日志文件净捅。

    • (1)、將日志輸出到控制臺(tái)辩块,比如蛔六,logTest.py 如下:

      import logging
      
      logging.basicConfig(level=logging.DEBUG,
                      format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
      # 開(kāi)始使用log功能
      logging.debug('這是 loggging debug message')
      logging.info('這是 loggging info message')
      logging.warning('這是 loggging a warning message')
      logging.error("這是logging error message")
      logging.critical("這是logging critical message")
      

      打印結(jié)果如下:

      2019-01-17 10:00:53,331 - logTest.py[line:21] - DEBUG: 這是 loggging debug message
      2019-01-17 10:00:53,331 - logTest.py[line:22] - INFO: 這是 loggging info message
      2019-01-17 10:00:53,331 - logTest.py[line:23] - WARNING: 這是 loggging a warning message
      2019-01-17 10:00:53,331 - logTest.py[line:24] - ERROR: 這是logging error message
      2019-01-17 10:00:53,331 - logTest.py[line:25] - CRITICAL: 這是logging critical message
      
    • (2)荆永、將日志輸出到文件log.txt,比如国章,logTest2.py 如下:

      import logging
      
      
      """
         level:日志等級(jí)具钥,5個(gè)等級(jí),從小到大依次是:debug液兽、info骂删、warning、error四啰、critical
         filename:要寫(xiě)入的日志文件名字
         filemode:日志寫(xiě)入的模式宁玫,a是追加日志信息 w是刪除后添加新的日志信息
         format:格式,asctime 時(shí)間柑晒、filename 報(bào)錯(cuò)文件名欧瘪、lineno 行數(shù) 、levelname 報(bào)錯(cuò)的等級(jí)敦迄、message 報(bào)錯(cuò)的信息
      """
      logging.basicConfig(level=logging.DEBUG,
                 filename='./log.txt',
                 filemode='a',
                 format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
      
      # 開(kāi)始使用log功能
      logging.debug('這是 loggging debug message')
      logging.info('這是 loggging info message')
      logging.warning('這是 loggging a warning message')
      logging.error("這是logging error message")
      logging.critical("這是logging critical message")
      

      運(yùn)行后會(huì)生成一個(gè) log.txt 文件

      運(yùn)行后會(huì)生成一個(gè) `log.txt` 文件

    • (3)恋追、既要把日志輸出到控制臺(tái), 還要寫(xiě)入日志文件
      這就需要一個(gè)叫作 Logger 的對(duì)象來(lái)幫忙罚屋,下面將對(duì)他進(jìn)行詳細(xì)介紹苦囱,現(xiàn)在這里先學(xué)習(xí)怎么實(shí)現(xiàn)把日志既要輸出到控制臺(tái)又要輸出到文件的功能。

      import logging  
      
      # 第一步脾猛,創(chuàng)建一個(gè)logger  
      logger = logging.getLogger()  
      logger.setLevel(logging.DEBUG)  # Log等級(jí)總開(kāi)關(guān)  
      
      # 第二步撕彤,創(chuàng)建一個(gè)handler,用于寫(xiě)入日志文件  
      logfile = './log.txt'  
      fh = logging.FileHandler(logfile, mode='a')  # open的打開(kāi)模式這里可以進(jìn)行參考
      fh.setLevel(logging.INFO)  # 輸出到file的log等級(jí)的開(kāi)關(guān)  
      
      # 第三步猛拴,再創(chuàng)建一個(gè)handler羹铅,用于輸出到控制臺(tái)  
      ch = logging.StreamHandler()  
      ch.setLevel(logging.WARNING)   # 輸出到console的log等級(jí)的開(kāi)關(guān)  
      
      # 第四步,定義handler的輸出格式  
      formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")  
      fh.setFormatter(formatter)  
      ch.setFormatter(formatter)  
      
      # 第五步愉昆,將logger添加到handler里面  
      logger.addHandler(fh)  
      logger.addHandler(ch)  
      
      # 日志  
      logger.debug('這是 logger debug message')  
      logger.info('這是 logger info message')  
      logger.warning('這是 logger warning message')  
      logger.error('這是 logger error message')  
      logger.critical('這是 logger critical message')
      

      運(yùn)行時(shí)終端的輸出結(jié)果:

      2019-01-17 11:21:01,785 - logTest3.py[line:28] - WARNING: 這是 logger warning message
      2019-01-17 11:21:01,785 - logTest3.py[line:29] - ERROR: 這是 logger error message
      2019-01-17 11:21:01,785 - logTest3.py[line:30] - CRITICAL: 這是 logger critical message
      

      log.txt 中职员,有如下數(shù)據(jù):

      2019-01-17 11:21:01,784 - logTest3.py[line:27] - INFO: 這是 logger info message
      2019-01-17 11:21:01,785 - logTest3.py[line:28] - WARNING: 這是 logger warning message
      2019-01-17 11:21:01,785 - logTest3.py[line:29] - ERROR: 這是 logger error message
      2019-01-17 11:21:01,785 - logTest3.py[line:30] - CRITICAL: 這是 logger critical message
      
  • 3.4、日志格式說(shuō)明

    • logging.basicConfig函數(shù)中跛溉,可以指定日志的輸出格式format焊切,這個(gè)參數(shù)可以輸出很多有用的信息,如下:

      %(levelno)s: 打印日志級(jí)別的數(shù)值
      %(levelname)s: 打印日志級(jí)別名稱(chēng)
      %(pathname)s: 打印當(dāng)前執(zhí)行程序的路徑芳室,其實(shí)就是sys.argv[0]
      %(filename)s: 打印當(dāng)前執(zhí)行程序名
      %(funcName)s: 打印日志的當(dāng)前函數(shù)
      %(lineno)d: 打印日志的當(dāng)前行號(hào)
      %(asctime)s: 打印日志的時(shí)間
      %(thread)d: 打印線(xiàn)程ID
      %(threadName)s: 打印線(xiàn)程名稱(chēng)
      %(process)d: 打印進(jìn)程ID
      %(message)s: 打印日志信息
      
    • 在工作中給的常用格式如下:

      format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
      

      這個(gè)格式可以輸出日志的打印時(shí)間专肪,是哪個(gè)模塊輸出的,輸出的日志級(jí)別是什么堪侯,以及輸入的日志內(nèi)容嚎尤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伍宦,隨后出現(xiàn)的幾起案子芽死,更是在濱河造成了極大的恐慌乏梁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件收奔,死亡現(xiàn)場(chǎng)離奇詭異掌呜,居然都是意外死亡滓玖,警方通過(guò)查閱死者的電腦和手機(jī)坪哄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)势篡,“玉大人翩肌,你說(shuō)我怎么就攤上這事〗疲” “怎么了念祭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)碍侦。 經(jīng)常有香客問(wèn)我粱坤,道長(zhǎng),這世上最難降的妖魔是什么瓷产? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任站玄,我火速辦了婚禮,結(jié)果婚禮上濒旦,老公的妹妹穿的比我還像新娘株旷。我一直安慰自己,他們只是感情好尔邓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布晾剖。 她就那樣靜靜地躺著,像睡著了一般梯嗽。 火紅的嫁衣襯著肌膚如雪齿尽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天灯节,我揣著相機(jī)與錄音循头,去河邊找鬼。 笑死显晶,一個(gè)胖子當(dāng)著我的面吹牛贷岸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磷雇,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偿警,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了唯笙?” 一聲冷哼從身側(cè)響起螟蒸,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盒使,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后七嫌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體少办,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年诵原,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了英妓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绍赛,死狀恐怖蔓纠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吗蚌,我是刑警寧澤腿倚,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蚯妇,受9級(jí)特大地震影響敷燎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜箩言,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一硬贯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧分扎,春花似錦澄成、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至菲饼,卻和暖如春肾砂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宏悦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工镐确, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饼煞。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓源葫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砖瞧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子息堂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • From:Python之日志處理(logging模塊) - 云游道士 - 博客園 https://www.cnbl...
    vigny的先生閱讀 2,684評(píng)論 3 5
  • 前言 在自動(dòng)化測(cè)試實(shí)踐過(guò)程中,必不可少的就是進(jìn)行日志管理,方便調(diào)試和生產(chǎn)問(wèn)題追蹤荣堰,python提供了logg...
    苦葉子閱讀 814評(píng)論 0 0
  • 常用模塊 認(rèn)識(shí)模塊 什么是模塊 什么是模塊振坚? 常見(jiàn)的場(chǎng)景:一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件薇搁,文...
    go以恒閱讀 1,947評(píng)論 0 6
  • 這是標(biāo)題 這是標(biāo)題 這是標(biāo)題 這是標(biāo)題 這是標(biāo)題 -列表第一項(xiàng)-列表第二項(xiàng)1.有序列表第一項(xiàng)2.有序列表第二項(xiàng)百度...
    Dizoo閱讀 310評(píng)論 0 0
  • 喜歡配色,窗簾色調(diào)也很和諧渡八。但是1:穿衣鏡的地方更喜歡搭成一個(gè)簡(jiǎn)易迷你隔斷區(qū)出來(lái)2:入戶(hù)空間實(shí)用性不好啃洋, 客餐廳全...
    TheraZhao閱讀 477評(píng)論 2 8