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

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

給路由參數(shù)添加正則表達(dá)式的原因:在實(shí)際開發(fā)時(shí)佃迄,url中往往會(huì)帶有很多的參數(shù)茶行,例如:/add/0003.html 中0003 就是參數(shù)沃呢,如果沒有正則的話断序,那么就需要編寫 N 次 @route 來進(jìn)行添加 url 對(duì)應(yīng)的函數(shù)到字典中流纹,此時(shí)字典中的鍵值對(duì)有 N 個(gè),浪費(fèi)空間违诗,而采用了正則的話,那么只要編寫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ù)的裝飾器來做路由

? ? ? ? :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='用戶名', password='密碼',

? ? ? ? ? ? charset='utf8')

? ? ? # 獲得Cursor對(duì)象

? ? ? cursor = conn.cursor()

? ? ? sql = """select * from info where code=%s;"""

? ? ? cursor.execute(sql,(stock_code,))

? ? ? print("************-----------1------------------")

? ? ? # 如果要是沒有這個(gè)股票代碼碉哑,那么就認(rèn)為是非法的請(qǐng)求

? ? ? if not cursor.fetchone():

? ? ? ? ? ? cursor.close()

? ? ? ? ? ? conn.close()

? ? ? ? ? ? return "沒有這支股票,大哥 亮蒋,我們是創(chuàng)業(yè)公司扣典,請(qǐng)手下留情..."

? ? ? print("************-----------2------------------")

? ? ? # 3.在股票存在的情況下查看股票是否關(guān)注過

? ? ? 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,))

? ? ? # 如果查出來表示關(guān)注過

? ? ? if cursor.fetchone():

? ? ? ? ? ? cursor.close()

? ? ? ? ? ? conn.close()

? ? ? ? ? ? return "已經(jīng)關(guān)注過了,請(qǐng)勿重復(fù)關(guān)注..."

? ? ? print("************-----------3------------------")

? ? ? # 4.在沒有關(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)沒有對(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

importurllib.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)行解碼直接寫入數(shù)據(jù)庫(kù)鳍侣,我們服務(wù)器里面存的是url編碼的內(nèi)容丁稀,所以我們需要對(duì)內(nèi)容進(jìn)行解碼,再存到數(shù)據(jù)庫(kù)倚聚,這樣下次讀取出來的時(shí)候不再是url編碼的內(nèi)容

三线衫、logging日志模塊

3.1、開發(fā)過程中出現(xiàn)bug是必不可免的惑折,你會(huì)怎樣debug授账?從第1行代碼開始看么枯跑?還是有個(gè)文件里面記錄著哪里錯(cuò)了更方便呢!0兹取全肮!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)重的;

解釋:

DEBUG:詳細(xì)的信息,通常只出現(xiàn)在診斷問題上

INFO:確認(rèn)一切按預(yù)期運(yùn)行

WARNING:一個(gè)跡象表明,一些意想不到的事情發(fā)生了,或表明一些問題在不久的將來(例如乍恐。磁盤空間低”)评疗。這個(gè)軟件還能按預(yù)期工作。

ERROR:更嚴(yán)重的問題,軟件沒能執(zhí)行一些功能

CRITICAL:一個(gè)嚴(yán)重的錯(cuò)誤,這表明程序本身可能無法繼續(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')

# 開始使用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:要寫入的日志文件名字

? filemode:日志寫入的模式,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')

# 開始使用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?文件

(3)逛球、既要把日志輸出到控制臺(tái), 還要寫入日志文件

這就需要一個(gè)叫作 Logger 的對(duì)象來幫忙苫昌,下面將對(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í)總開關(guān)?

# 第二步奥务,創(chuàng)建一個(gè)handler,用于寫入日志文件?

logfile = './log.txt'?

fh = logging.FileHandler(logfile, mode='a')? # open的打開模式這里可以進(jìn)行參考

fh.setLevel(logging.INFO)? # 輸出到file的log等級(jí)的開關(guān)?

# 第三步袜硫,再創(chuàng)建一個(gè)handler氯葬,用于輸出到控制臺(tái)?

ch = logging.StreamHandler()?

ch.setLevel(logging.WARNING)? # 輸出到console的log等級(jí)的開關(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、日志格式說明

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

%(levelno)s: 打印日志級(jí)別的數(shù)值

%(levelname)s: 打印日志級(jí)別名稱

%(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: 打印線程ID

%(threadName)s: 打印線程名稱

%(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)容所刀。


作者:IIronMan

鏈接:http://www.reibang.com/p/a35ef3af2800

來源:簡(jiǎn)書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)捞挥,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處浮创。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市砌函,隨后出現(xiàn)的幾起案子斩披,更是在濱河造成了極大的恐慌,老刑警劉巖讹俊,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垦沉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仍劈,警方通過查閱死者的電腦和手機(jī)厕倍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贩疙,“玉大人讹弯,你說我怎么就攤上這事况既。” “怎么了组民?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵棒仍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我臭胜,道長(zhǎng)莫其,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任耸三,我火速辦了婚禮榜配,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吕晌。我一直安慰自己宙帝,他們只是感情好辖佣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般昵济。 火紅的嫁衣襯著肌膚如雪泳叠。 梳的紋絲不亂的頭發(fā)上决记,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天美莫,我揣著相機(jī)與錄音,去河邊找鬼蹬跃。 笑死匙瘪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝶缀。 我是一名探鬼主播丹喻,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼翁都!你這毒婦竟也來了碍论?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤柄慰,失蹤者是張志新(化名)和其女友劉穎鳍悠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坐搔,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藏研,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了概行。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢挡。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袒哥,到底是詐尸還是另有隱情,我是刑警寧澤消略,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布堡称,位于F島的核電站,受9級(jí)特大地震影響艺演,放射性物質(zhì)發(fā)生泄漏却紧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一胎撤、第九天 我趴在偏房一處隱蔽的房頂上張望晓殊。 院中可真熱鬧,春花似錦伤提、人聲如沸巫俺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)介汹。三九已至,卻和暖如春舶沛,著一層夾襖步出監(jiān)牢的瞬間嘹承,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工如庭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叹卷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓坪它,卻偏偏與公主長(zhǎng)得像骤竹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子往毡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 一瘤载、給路由添加正則表達(dá)式 給路由參數(shù)添加正則表達(dá)式的原因:在實(shí)際開發(fā)時(shí),url中往往會(huì)帶有很多的參數(shù)卖擅,例如:/ad...
    IIronMan閱讀 1,631評(píng)論 1 12
  • 前言 在自動(dòng)化測(cè)試實(shí)踐過程中鸣奔,必不可少的就是進(jìn)行日志管理,方便調(diào)試和生產(chǎn)問題追蹤惩阶,python提供了logg...
    苦葉子閱讀 823評(píng)論 0 0
  • 常用模塊 認(rèn)識(shí)模塊 什么是模塊 什么是模塊断楷? 常見的場(chǎng)景:一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件锨匆,文...
    go以恒閱讀 1,965評(píng)論 0 6
  • logging介紹Python的logging模塊提供了通用的日志系統(tǒng),可以方便第三方模塊或者是應(yīng)用使用。這個(gè)模塊...
    modingfa閱讀 6,830評(píng)論 0 2
  • idea 添加注釋/** 然后回車 選中代碼塊 Ctrl+Shift+/ 重點(diǎn)推薦閱讀:https://www....
    Helen_Cat閱讀 19,953評(píng)論 0 37