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