Django日志和調(diào)試工具欄實(shí)現(xiàn)高效的應(yīng)用程序調(diào)試和性能優(yōu)化
配置日志
在Django中,可以通過logging模塊來記錄日志。日志記錄器是將日志消息傳遞給日志處理器的對(duì)象。當(dāng)需要記錄日志時(shí),可以使用以下代碼來創(chuàng)建一個(gè)日志記錄器:
import logging logger = logging.getLogger(__name__)
在創(chuàng)建日志記錄器后,可以再創(chuàng)建一個(gè)或多個(gè)日志處理器來處理日志消息。日志處理器有多個(gè)種類,下面是一些常用的日志處理器:
logging.StreamHandler()
- 將日志消息發(fā)送到標(biāo)準(zhǔn)輸出流logging.FileHandler(filename, mode='a', encoding=None, delay=False)
- 將日志消息寫入文件logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)
- 將日志消息寫入文件,如果文件的大小超出maxBytes
指定的值,那么將重新生成一個(gè)文件來記錄日志logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False)
- 將日志消息寫入文件,根據(jù)指定的時(shí)間間隔和when
參數(shù)生成新文件logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)
- 將日志消息寫入文件,如果文件的大小超出maxBytes
指定的值,那么將重新生成一個(gè)文件來記錄日志logging.handlers.SocketHandler(host, port)
- 使用TCP協(xié)議,將日志信息發(fā)送到指定主機(jī)和端口的網(wǎng)絡(luò)主機(jī)上logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)
- 將日志輸出到指定的郵件地址logging.MemoryHandler(capacity, flushLevel=ERROR, target=None, flushOnClose=True)
- 將日志輸出到內(nèi)存指定的緩沖區(qū)中
上面每個(gè)日志處理器都指定了一個(gè)名為level
的屬性,它代表了日志的級(jí)別,不同的日志級(jí)別反映出日志中記錄信息的嚴(yán)重性。Python中定義了六個(gè)級(jí)別的日志,按照從低到高的順序依次是:NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL。
日志記錄器中配置的日志級(jí)別有可能不是最終的日志級(jí)別,因?yàn)檫€要參考日志處理器中配置的日志級(jí)別,取二者中級(jí)別較高者作為最終的日志級(jí)別。
Django框架提供了如下所示的內(nèi)置記錄器:
django
- 在Django層次結(jié)構(gòu)中的所有消息記錄器django.request
- 與請(qǐng)求處理相關(guān)的日志消息。5xx響應(yīng)被視為錯(cuò)誤消息;4xx響應(yīng)被視為為警告消息django.server
- 與通過runserver調(diào)用的服務(wù)器所接收的請(qǐng)求相關(guān)的日志消息。5xx響應(yīng)被視為錯(cuò)誤消息;4xx響應(yīng)被記錄為警告消息;其他一切都被記錄為INFOdjango.template
- 與模板渲染相關(guān)的日志消息django.db.backends
- 有與數(shù)據(jù)庫交互產(chǎn)生的日志消息,如果希望顯示ORM框架執(zhí)行的SQL語句,就可以使用該日志記錄器。
配置Django-Debug-Toolbar
如果想調(diào)試你的Django項(xiàng)目,你一定不能不過名為Django-Debug-Toolbar的神器,它是項(xiàng)目開發(fā)階段輔助調(diào)試和優(yōu)化的必備工具,只要配置了它,就可以很方便的查看到項(xiàng)目運(yùn)行信息,這些信息對(duì)調(diào)試項(xiàng)目和優(yōu)化Web應(yīng)用性能都是至關(guān)重要的。
使用Django-Debug-Toolbar只需要進(jìn)行以下步驟:
安裝Django-Debug-Toolbar。
pip install django-debug-toolbar
修改settings.py
文件:
INSTALLED_APPS = [ 'debug_toolbar', ] MIDDLEWARE = [ 'debug_toolbar.middleware.DebugToolbarMiddleware', ] DEBUG_TOOLBAR_CONFIG = { # 引入jQuery庫 'JQUERY_URL': '<https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js>', # 工具欄是否折疊 'SHOW_COLLAPSED': True, # 是否顯示工具欄 'SHOW_TOOLBAR_CALLBACK': lambda x: True, }
修改urls.py
文件:
if settings.DEBUG: import debug_toolbar urlpatterns.insert(0, path('__debug__/', include(debug_toolbar.urls)))
在配置好Django-Debug-Toolbar之后,頁面右側(cè)會(huì)看到一個(gè)調(diào)試工具欄,上面包括了各種調(diào)試信息,例如請(qǐng)求和響應(yīng)信息、SQL查詢、緩存、模板、日志等等??梢酝ㄟ^這些信息來更好地了解Web應(yīng)用程序的運(yùn)行情況和性能瓶頸。
優(yōu)化ORM代碼
Django的ORM(Object-Relational Mapping)框架是其最重要的特性之一,它可以將Python對(duì)象映射到數(shù)據(jù)庫中的表和列,使得開發(fā)者可以使用面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫。但是,ORM框架也有一些性能上的問題,如果不加以優(yōu)化,可能會(huì)導(dǎo)致Web應(yīng)用程序的性能瓶頸。
以下是一些優(yōu)化ORM代碼的技巧:
使用select_related
和prefetch_related
select_related
和prefetch_related
是Django ORM框架中用來優(yōu)化查詢性能的兩個(gè)方法。select_related
可以在查詢時(shí)一次性獲取與主表關(guān)聯(lián)的外鍵表的數(shù)據(jù),而prefetch_related
則可以在查詢時(shí)一次性獲取與主表關(guān)聯(lián)的多對(duì)多關(guān)系表的數(shù)據(jù)。這樣可以減少查詢次數(shù),提高查詢性能。
使用annotate
和aggregate
annotate
和aggregate
是Django中用來計(jì)算聚合數(shù)據(jù)的方法。annotate
是用來給查詢結(jié)果添加新的字段的方法,而aggregate
則是用來對(duì)查詢結(jié)果進(jìn)行聚合計(jì)算的方法。這些方法可以在查詢時(shí)一次性計(jì)算出需要的聚合數(shù)據(jù),而不需要在后續(xù)的處理中再進(jìn)行計(jì)算。
使用values
和values_list
values
和values_list
是Django ORM框架中用來獲取指定字段數(shù)據(jù)的方法。values
可以返回一個(gè)QuerySet對(duì)象,其中包含了指定字段的鍵值對(duì),而values_list
則可以返回一個(gè)QuerySet對(duì)象,其中包含了指定字段的元組。這些方法可以減少查詢結(jié)果集的大小,提高查詢性能。
使用bulk_create
和bulk_update
bulk_create
和bulk_update
是Django ORM框架中用來批量創(chuàng)建和更新數(shù)據(jù)的方法。這些方法可以減少數(shù)據(jù)庫操作的次數(shù),提高數(shù)據(jù)庫操作的性能。
使用cache
Django中提供了一個(gè)緩存框架,可以將查詢結(jié)果緩存起來,以減少數(shù)據(jù)庫的訪問次數(shù)。可以使用cache
裝飾器或者cache_page
裝飾器來緩存查詢結(jié)果。
使用raw
查詢
Django中的ORM框架雖然方便易用,但是在一些復(fù)雜的查詢場(chǎng)景中可能性能并不理想。在這種情況下,可以使用raw
查詢來直接執(zhí)行SQL語句,以獲得更好的性能。
以上是一些優(yōu)化ORM代碼的技巧,這些技巧可以幫助開發(fā)者提高Web應(yīng)用程序的性能,減少性能瓶頸。在實(shí)際開發(fā)中,需要根據(jù)具體的場(chǎng)景和需求選擇合適的優(yōu)化方法。
到此這篇關(guān)于Django日志和調(diào)試工具欄實(shí)現(xiàn)高效的應(yīng)用程序調(diào)試和性能優(yōu)化的文章就介紹到這了,更多相關(guān)Django日志和調(diào)試工具欄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pygame學(xué)習(xí)筆記(6):完成一個(gè)簡(jiǎn)單的游戲
這篇文章主要介紹了pygame學(xué)習(xí)筆記(6):完成一個(gè)簡(jiǎn)單的游戲,本文綜合了學(xué)習(xí)過的知識(shí),完成一個(gè)簡(jiǎn)單的游戲開發(fā),是本系列文章的最后一篇,需要的朋友可以參考下2015-04-04在pandas中一次性刪除dataframe的多個(gè)列方法
下面小編就為大家分享一篇在pandas中一次性刪除dataframe的多個(gè)列方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04pygame實(shí)現(xiàn)俄羅斯方塊游戲(AI篇2)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)俄羅斯方塊游戲AI的第2篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10Python collections中的雙向隊(duì)列deque簡(jiǎn)單介紹詳解
這篇文章主要介紹了Python collections中的雙向隊(duì)列deque簡(jiǎn)單介紹詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python實(shí)現(xiàn)向好友發(fā)送微信消息優(yōu)化篇
利用python可以實(shí)現(xiàn)微信消息發(fā)送功能,怎么實(shí)現(xiàn)呢?你肯定會(huì)想著很復(fù)雜,但是python的好處就是很多人已經(jīng)把接口打包做好了,只需要調(diào)用即可,今天通過本文給大家分享使用?Python?實(shí)現(xiàn)微信消息發(fā)送的思路代碼,一起看看吧2022-06-06PHP webshell檢查工具 python實(shí)現(xiàn)代碼
Web安全應(yīng)急響應(yīng)中,不免要檢查下服務(wù)器上是否被上傳了webshell,手工檢查比較慢,就寫了個(gè)腳本來檢查了。Windows平臺(tái)下已經(jīng)有了lake2寫的雷克圖的了,一般的檢查也夠用了,寫了個(gè)Linux下面的,用python寫的。2009-09-09Pytorch訓(xùn)練網(wǎng)絡(luò)過程中l(wèi)oss突然變?yōu)?的解決方案
這篇文章主要介紹了Pytorch訓(xùn)練網(wǎng)絡(luò)過程中l(wèi)oss突然變?yōu)?的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05