如何用Python搭建監(jiān)控平臺(tái)
監(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 :
接著,我們來(lái)創(chuàng)建一個(gè)新的 Django 項(xiàng)目:
這時(shí),你能看到文件系統(tǒng)大概是下面這樣的:
我簡(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)添加管理員賬戶(hù):
然后,我們來(lái)啟動(dòng) Django 的 debugging 模式:
最后,打開(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 代碼:
models.py 文件主要用一個(gè) Python 類(lèi)來(lái)描述數(shù)據(jù)表,稱(chēng)為模型 。運(yùn)用這個(gè)類(lèi),你可以通過(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)名稱(chēng),例如 btc,然后這個(gè)函數(shù)返回一個(gè)渲染頁(yè)面。
不過(guò),這個(gè)函數(shù)具體是怎么工作的呢?我們一行行來(lái)看。
positions = Position.objects.filter(asset = asset)
,這行代碼向數(shù)據(jù)庫(kù)中執(zhí)行一個(gè)查詢(xún)操作,其中, 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 在最終送給用戶(hù)之前,需要被我們預(yù)先處理一下,而預(yù)先處理的方式就是找到對(duì)應(yīng)的地方進(jìn)行替換。
我們來(lái)看下面這段示例代碼:
我重點(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)講解了。
到這里,我們就可以通過(guò)?http://127.0.0.1:8000/positions/btc
?來(lái)訪(fǎng)問(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
。
此時(shí),你的目錄結(jié)構(gòu)應(yīng)該長(zhǎng)成下面這樣:
第二步,修改?TradingMonitor/settings.py
:
第三步,運(yùn)行?python manage.py makemigrations
:
第四步,運(yùn)行?python manage.py migrate
:
這幾步的具體操作,我都用代碼和注釋表示了出來(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查詢(xún)、模板等。
總結(jié)
本文,我們以 Django 這個(gè) Python 后端為例,講解了搭建一個(gè)服務(wù)端的過(guò)程。你應(yīng)該發(fā)現(xiàn)了,使用 RESTful Framework 搭建服務(wù)器是如此的簡(jiǎn)單呀!
轉(zhuǎn)載: https://mp.weixin.qq.com/s/Ziglxtoh80TaymNdPjDp5A
本文使用 文章同步助手 同步
文章知識(shí)點(diǎn)與官方知識(shí)檔案匹配,可進(jìn)一步學(xué)習(xí)相關(guān)知識(shí)
本文使用?文章同步助手?同步
如何用Python搭建監(jiān)控平臺(tái)的評(píng)論 (共 條)
