Python搭建監(jiān)控平臺(tái)的實(shí)現(xiàn)示例
監(jiān)控和運(yùn)維,是互聯(lián)網(wǎng)工業(yè)鏈上非常重要的一環(huán)。監(jiān)控的目的就是防患于未然。通過(guò)監(jiān)控,我們能夠及時(shí)了解到企業(yè)網(wǎng)絡(luò)的運(yùn)行狀態(tài)。一旦出現(xiàn)安全隱患,你就可以及時(shí)預(yù)警,或者是以其他方式通知運(yùn)維人員,讓運(yùn)維監(jiān)控人員有時(shí)間處理和解決隱患,避免影響業(yè)務(wù)系統(tǒng)的正常使用,將一切問(wèn)題的根源扼殺在搖籃當(dāng)中。
不過(guò),萬(wàn)變不離其宗,運(yùn)維工作最重要的就是維護(hù)系統(tǒng)的穩(wěn)定性。除了熟悉運(yùn)用各種提高運(yùn)維效率的工具來(lái)輔助工作外,云資源費(fèi)用管理、安全管理、監(jiān)控等,都需要耗費(fèi)不少精力和時(shí)間。運(yùn)維監(jiān)控不是一朝一夕得來(lái)的,而是隨著業(yè)務(wù)發(fā)展的過(guò)程中同步和發(fā)展的。
今天我們就使用 Django 這個(gè) Web 框架,來(lái)搭建一個(gè)簡(jiǎn)單的量化監(jiān)控平臺(tái)。
Django 簡(jiǎn)介和安裝
Django 是用 Python 開(kāi)發(fā)的一個(gè)免費(fèi)開(kāi)源的 Web 框架,可以用來(lái)快速搭建優(yōu)雅的高性能網(wǎng)站。它采用的是“MVC”的框架模式,即模型 M、視圖 V 和控制器 C。
Django 最大的特色,在于將網(wǎng)頁(yè)和數(shù)據(jù)庫(kù)中復(fù)雜的關(guān)系,轉(zhuǎn)化為 Python 中對(duì)應(yīng)的簡(jiǎn)單關(guān)系。它的設(shè)計(jì)目的,是使常見(jiàn)的Web開(kāi)發(fā)任務(wù)變得快速而簡(jiǎn)單。Django是開(kāi)源的,不是商業(yè)項(xiàng)目或者科研項(xiàng)目,并且集中力量解決Web開(kāi)發(fā)中遇到的一系列問(wèn)題。所以,Django 每天都會(huì)在現(xiàn)有的基礎(chǔ)上進(jìn)步,以適應(yīng)不斷更迭的開(kāi)發(fā)需求。這樣既節(jié)省了開(kāi)發(fā)時(shí)間,也提高了后期維護(hù)的效率。
說(shuō)了這么多,接下來(lái),我們通過(guò)上手使用進(jìn)一步來(lái)了解。先來(lái)看一下,如何安裝和使用 Django。你可以先按照下面代碼塊的內(nèi)容來(lái)操作,安裝Django :
pip3?install?Django django-admin?--version ##########?輸出?########## 2.2.3
接著,我們來(lái)創(chuàng)建一個(gè)新的 Django 項(xiàng)目:
django-admin?startproject?TradingMonitor cd?TradingMonitor/ python3?manage.py?migrate ##########?輸出?##########
??Applying?contenttypes.0001_initial...?OK ??Applying?auth.0001_initial...?OK ??Applying?admin.0001_initial...?OK ??Applying?admin.0002_logentry_remove_auto_add...?OK ??Applying?admin.0003_logentry_add_action_flag_choices...?OK ??Applying?contenttypes.0002_remove_content_type_name...?OK ??Applying?auth.0002_alter_permission_name_max_length...?OK ??Applying?auth.0003_alter_user_email_max_length...?OK ??Applying?auth.0004_alter_user_username_opts...?OK ??Applying?auth.0005_alter_user_last_login_null...?OK ??Applying?auth.0006_require_contenttypes_0002...?OK ??Applying?auth.0007_alter_validators_add_error_messages...?OK ??Applying?auth.0008_alter_user_username_max_length...?OK ??Applying?auth.0009_alter_user_last_name_max_length...?OK ??Applying?auth.0010_alter_group_name_max_length...?OK ??Applying?auth.0011_update_proxy_permissions...?OK ??Applying?sessions.0001_initial...?OK
這時(shí),你能看到文件系統(tǒng)大概是下面這樣的:
TradingMonitor/ ├──?TradingMonitor │???├──?__init__.py │???├──?settings.py │???├──?urls.py │???└──?wsgi.py ├──?db.sqlite3 └──?manage.py
我簡(jiǎn)單解釋一下它的意思:
- TradingMonitor/TradingMonitor,表示項(xiàng)目最初的 Python 包;
- TradingMonitor/init.py,表示一個(gè)空文件,聲明所在目錄的包為一個(gè) Python 包;
- TradingMonitor/settings.py,管理項(xiàng)目的配置信息;
- TradingMonitor/urls.py,聲明請(qǐng)求 URL 的映射關(guān)系;
- TradingMonitor/wsgi.py,表示Python 程序和 Web 服務(wù)器的通信協(xié)議;
- manage.py,表示一個(gè)命令行工具,用來(lái)和 Django 項(xiàng)目進(jìn)行交互;
- Db.sqlite3,表示默認(rèn)的數(shù)據(jù)庫(kù),可以在設(shè)置中替換成其他數(shù)據(jù)庫(kù)。
另外,你可能注意到了上述命令中的 python3 manage.py migrate
,這個(gè)命令表示創(chuàng)建或更新數(shù)據(jù)庫(kù)模式。每當(dāng) model 源代碼被改變后,如果我們要將其應(yīng)用到數(shù)據(jù)庫(kù)上,就需要執(zhí)行一次這個(gè)命令。
接下來(lái),我們?yōu)檫@個(gè)系統(tǒng)添加管理員賬戶:
python3?manage.py?createsuperuser ##########?輸出?########## Username?(leave?blank?to?use?'ubuntu'):?admin Email?address: Password: Password?(again): Superuser?created?successfully.
然后,我們來(lái)啟動(dòng) Django 的 debugging 模式:
python3?manage.py?runserver
最后,打開(kāi)瀏覽器輸入: http://127.0.0.1:8000
。如果你能看到下面這個(gè)畫(huà)面,就說(shuō)明 Django 已經(jīng)部署成功了。
Django 的安裝是不是非常簡(jiǎn)單呢?這其實(shí)也是 Python 一貫的理念,簡(jiǎn)潔,并簡(jiǎn)化入門(mén)的門(mén)檻。
OK,現(xiàn)在我們?cè)俣ㄎ坏?http://127.0.0.1:8000/admin
,你會(huì)看到 Django 的后臺(tái)管理網(wǎng)頁(yè),這里我就不過(guò)多介紹了。
到此,Django 就已經(jīng)成功安裝,并且正常啟動(dòng)啦。
MVC 架構(gòu)
剛剛說(shuō)過(guò),MVC 架構(gòu)是 Django 設(shè)計(jì)模式的精髓。接下來(lái),我們就來(lái)具體看一下這個(gè)架構(gòu),并通過(guò) Django 動(dòng)手搭建一個(gè)服務(wù)端。
設(shè)計(jì)模型 Model
peewee 這個(gè)庫(kù),它能避開(kāi)通過(guò)繁瑣的 SQL 語(yǔ)句來(lái)操作 MySQL,直接使用 Python 的 class 來(lái)進(jìn)行轉(zhuǎn)換。事實(shí)上,這也是 Django 采取的方式。
Django 無(wú)需數(shù)據(jù)庫(kù)就可以使用,它通過(guò)對(duì)象關(guān)系映射器(object-relational mapping),僅使用Python代碼就可以描述數(shù)據(jù)結(jié)構(gòu)。
我們先來(lái)看下面這段 Model 代碼:
#??TradingMonitor/models.py from?django.db?import?models class?Position(models.Model): ????asset?=?models.CharField(max_length=10) ????timestamp?=?models.DateTimeField() ????amount?=?models.DecimalField(max_digits=10,?decimal_places=3)
models.py 文件主要用一個(gè) Python 類來(lái)描述數(shù)據(jù)表,稱為模型 。運(yùn)用這個(gè)類,你可以通過(guò)簡(jiǎn)單的 Python 代碼來(lái)創(chuàng)建、檢索、更新、刪除數(shù)據(jù)庫(kù)中的記錄,而不用寫(xiě)一條又一條的SQL語(yǔ)句,這也是我們之前所說(shuō)的避免通過(guò) SQL 操作數(shù)據(jù)庫(kù)。
在這里,我們創(chuàng)建了一個(gè) Position 模型,用來(lái)表示我們的交易倉(cāng)位信息。其中,
- asset 表示當(dāng)前持有資產(chǎn)的代碼,例如 btc;
- timestamp 表示時(shí)間戳;
- amount 則表示時(shí)間戳?xí)r刻的持倉(cāng)信息。
設(shè)計(jì)視圖 Views
在模型被定義之后,我們便可以在視圖中引用模型了。通常,視圖會(huì)根據(jù)參數(shù)檢索數(shù)據(jù),加載一個(gè)模板,并使用檢索到的數(shù)據(jù)呈現(xiàn)模板。
設(shè)計(jì)視圖,則是我們用來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯的地方。我們來(lái)看 render_positions 這個(gè)代碼,它接受 request 和 asset 兩個(gè)參數(shù),我們先不用管 request。這里的 asset 表示指定一個(gè)資產(chǎn)名稱,例如 btc,然后這個(gè)函數(shù)返回一個(gè)渲染頁(yè)面。
#??TradingMonitor/views.py from?django.shortcuts?import?render from?.models?import?Position def?render_positions(request,?asset): ????positions?=?Position.objects.filter(asset?=?asset) ????context?=?{<!-- -->'asset':?asset,?'positions':?positions} ????return?render(request,?'positions.html',?context)
不過(guò),這個(gè)函數(shù)具體是怎么工作的呢?我們一行行來(lái)看。
positions = Position.objects.filter(asset = asset)
,這行代碼向數(shù)據(jù)庫(kù)中執(zhí)行一個(gè)查詢操作,其中, filter 表示篩選,意思是從數(shù)據(jù)庫(kù)中選出所有我們需要的 asset 的信息。不過(guò),這里我只是為你舉例做示范;真正做監(jiān)控的時(shí)候,我們一般會(huì)更有針對(duì)性地從數(shù)據(jù)庫(kù)中篩選讀取信息,而不是一口氣讀取出所有的信息。context = {'asset': asset, 'positions': positions}
,這行代碼沒(méi)什么好說(shuō)的,封裝一個(gè)字典。至于這個(gè)字典的用處,下面的內(nèi)容中可以體現(xiàn)。return render(request, 'positions.html', context)
,最后這行代碼返回一個(gè)頁(yè)面。這里我們采用的模板設(shè)計(jì),這也是 Django 非常推薦的開(kāi)發(fā)方式,也就是讓模板和數(shù)據(jù)分離,這樣,數(shù)據(jù)只需要向其中填充即可。
最后的模板文件是 position.html
,你應(yīng)該注意到了, context 作為變量傳給了模板,下面我們就來(lái)看一下設(shè)計(jì)模板的內(nèi)容。
設(shè)計(jì)模板Templates
模板文件,其實(shí)就是 HTML 文件和部分代碼的綜合。你可以想象成,這個(gè)HTML 在最終送給用戶之前,需要被我們預(yù)先處理一下,而預(yù)先處理的方式就是找到對(duì)應(yīng)的地方進(jìn)行替換。
我們來(lái)看下面這段示例代碼:
#??TradingMonitor/templates/positions.html <!DOCTYPE?html> <html?lang="en-US"> <head> <title>Positions?for?{<!-- -->{asset}}</title> </head> <body> <h1>Positions?for?{<!-- -->{asset}}</h1> <table> <tr> ????<th>Time</th> ????<th>Amount</th> </tr> {%?for?position?in?positions?%} <tr> ????<th>{<!-- -->{position.timestamp}}</th> ????<th>{<!-- -->{position.amount}}</th> </tr> {%?endfor?%} </table> </body>
我重點(diǎn)說(shuō)一下幾個(gè)地方。首先是 <title>Positions for {{asset}}</title>
,這里雙大括號(hào)括住 asset 這個(gè)變量,這個(gè)變量對(duì)應(yīng)的正是前面 context 字典中的 asset key。Django 的渲染引擎會(huì)將 asset ,替換成 context 中 asset 對(duì)應(yīng)的內(nèi)容,此處是替換成了 btc。
再來(lái)看 {% for position in positions %}
,這是個(gè)很關(guān)鍵的地方。我們需要處理一個(gè)列表的情況,用 for 對(duì) positions 進(jìn)行迭代就行了。這里的 positions ,同樣對(duì)應(yīng)的是 context 中的 positions。
末尾的 {% endfor %}
,自然就表示結(jié)束了。這樣,我們就將數(shù)據(jù)封裝到了一個(gè)列表之中。
設(shè)計(jì)鏈接 Urls
最后,我們需要為我們的操作提供 URL 接口,具體操作我放在了下面的代碼中,內(nèi)容比較簡(jiǎn)單,我就不詳細(xì)展開(kāi)講解了。
#??TradingMonitor/urls.py from?django.contrib?import?admin from?django.urls?import?path from?.?import?views urlpatterns?=?[ ????path('admin/',?admin.site.urls), ????path('positions/<str:asset>',?views.render_positions), ]
到這里,我們就可以通過(guò) http://127.0.0.1:8000/positions/btc
來(lái)訪問(wèn)啦!
測(cè)試
當(dāng)然,除了主要流程外,我還需要強(qiáng)調(diào)幾個(gè)很簡(jiǎn)單但非常關(guān)鍵的細(xì)節(jié),不然,我們這些改變就不能被真正地應(yīng)用。
第一步,在 TradingMonitor/TradingMonitor
下,新建一個(gè)文件夾 migrations;并在這個(gè)文件夾中,新建一個(gè)空文件 __init__.py
。
mkdir?TradingMonitor/migrations touch?TradingMonitor/migrations/__init__.py
此時(shí),你的目錄結(jié)構(gòu)應(yīng)該長(zhǎng)成下面這樣:
TradingMonitor/ ├──?TradingMonitor │???├──?migrations │???????└──?__init__.py │???├──?templates │???????└──?positions.html │???├──?__init__.py │???├──?settings.py │???├──?urls.py │???├──?models.py │???├──?views.py │???└──?wsgi.py ├──?db.sqlite3 └──?manage.py
第二步,修改 TradingMonitor/settings.py
:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'TradingMonitor', # 這里把我們的 app 加上 ]
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'TradingMonitor/templates')], # 這里把 templates 的目錄加上 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
第三步,運(yùn)行 python manage.py makemigrations
:
python?manage.py?makemigrations ##########?輸出?########## Migrations?for?'TradingMonitor': ??TradingMonitor/migrations/0001_initial.py ????-?Create?model?Position
第四步,運(yùn)行 python manage.py migrate
:
python?manage.py?migrate ##########?輸出?########## Operations?to?perform: ??Apply?all?migrations:?TradingMonitor,?admin,?auth,?contenttypes,?sessions Running?migrations: ??Applying?TradingMonitor.0001_initial...?OK
這幾步的具體操作,我都用代碼和注釋表示了出來(lái),你完全可以同步進(jìn)行操作。操作完成后,現(xiàn)在,我們的數(shù)據(jù)結(jié)構(gòu)就已經(jīng)被成功同步到數(shù)據(jù)庫(kù)中了。
最后,輸入 python manage.py runserver
,然后打開(kāi)瀏覽器輸入 http://127.0.0.1:8000/positions/btc
,你就能看到效果啦。
現(xiàn)在,我們?cè)倩剡^(guò)頭來(lái)看一下 MVC 模式,你可以看到,M、V、C這三者,以一種插件似的、松耦合的方式連接在一起:
當(dāng)然,我?guī)銓?xiě)的只是一個(gè)簡(jiǎn)單的 Django 應(yīng)用程序,對(duì)于真正的量化平臺(tái)監(jiān)控系統(tǒng)而言,這還只是一個(gè)簡(jiǎn)單的開(kāi)始。
除此之外,對(duì)于監(jiān)控系統(tǒng)來(lái)說(shuō),其實(shí)還有著非常多的開(kāi)源插件可以使用。有一些界面非??犰牛幸恍┛梢宰龅胶芨叩姆€(wěn)定性和易用性,它們很多都可以結(jié)合 Django 做出很好的效果來(lái)。比較典型的有:
- Graphite 是一款存儲(chǔ)時(shí)間序列數(shù)據(jù),并通過(guò) Django Web 應(yīng)用程序在圖形中顯示的插件;
- Vimeo 則是一個(gè)基于 Graphite 的儀表板,具有附加功能和平滑的設(shè)計(jì);
- Scout 監(jiān)控 Django和Flask應(yīng)用程序的性能,提供自動(dòng)檢測(cè)視圖、SQL查詢、模板等。
總結(jié)
本文,我們以 Django 這個(gè) Python 后端為例,講解了搭建一個(gè)服務(wù)端的過(guò)程。你應(yīng)該發(fā)現(xiàn)了,使用 RESTful Framework 搭建服務(wù)器是如此的簡(jiǎn)單呀!
到此這篇關(guān)于Python搭建監(jiān)控平臺(tái)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python搭建監(jiān)控平臺(tái)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 如何利用Python監(jiān)控別人的網(wǎng)站
- Python實(shí)現(xiàn)監(jiān)控一個(gè)程序的運(yùn)行情況
- Python實(shí)現(xiàn)監(jiān)控屏幕界面內(nèi)容變化并發(fā)送通知
- Python實(shí)現(xiàn)監(jiān)控內(nèi)存使用情況和代碼執(zhí)行時(shí)間
- python監(jiān)控日志中的報(bào)錯(cuò)并進(jìn)行郵件報(bào)警
- python 監(jiān)控某個(gè)進(jìn)程內(nèi)存的情況問(wèn)題
- 利用Python上傳日志并監(jiān)控告警的方法詳解
- 基于Python實(shí)現(xiàn)實(shí)時(shí)監(jiān)控CPU使用率
相關(guān)文章
使用Django框架中ORM系統(tǒng)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)增刪改查
這篇文章主要介紹了使用Django的ORM實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)增刪改查方法,文中附含詳細(xì)示例代碼以及過(guò)程詳解,有需要的朋友可以借鑒參考下2021-09-09解決Python出現(xiàn)_warn_unsafe_extraction問(wèn)題的方法
這篇文章主要為大家詳細(xì)介紹了解決Python出現(xiàn)'_warn_unsafe_extraction'問(wèn)題的方法,感興趣的小伙伴們可以參考一下2016-03-03PyPDF2讀取PDF文件內(nèi)容保存到本地TXT實(shí)例
這篇文章主要介紹了PyPDF2讀取PDF文件內(nèi)容保存到本地TXT實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05python3 os進(jìn)行嵌套操作的實(shí)例講解
在本篇文章里小編給大家整理了關(guān)于python3 os進(jìn)行嵌套操作的實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-11-11Python使用Holoviews創(chuàng)建復(fù)雜的可視化布局
Holoviews是一個(gè)基于Python的開(kāi)源庫(kù),旨在簡(jiǎn)化數(shù)據(jù)可視化的創(chuàng)建過(guò)程,本文將為新手朋友詳細(xì)介紹如何使用Holoviews創(chuàng)建復(fù)雜的可視化布局,感興趣的可以了解下2024-11-11