注意:看這篇博客須要先看我以前寫的一篇博客,在 https://my.oschina.net/zhuangweihong/blog/780913 (flask獲取遠程服務器的硬件信息) 這篇博客中有提到,獲取遠程服務器的硬件信息能夠入mysql數據庫,如今來實現下。還實現了下分頁的功能,以下截圖:html
首先應該瞭解下SQLAlchemy框架對mysql數據庫的操做,使用SQLAlchemy,除了要安裝SQLAlchemy外,還須要安裝MySQL-python,安裝完後看下代碼:前端
from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://xxx:xxx@192.168.xxx.xxx/xxx' db = SQLAlchemy(app) #添加服務器 def server_add(server1): db.session.add(server1) db.session.commit() #刪除服務器 def server_delete(server1): db.session.delete(server1) db.session.commit() #查詢服務器(經過ip) def server_query_from_ip(ip): server1 = server.Server.query.filter_by(ip = ip).first() return server1 #查詢服務器(全部) def server_query_all(): server_all = server.Server.query.all() return server_all #查詢服務器(分頁) def server_query_page(page_now, page_size): server_page = server.Server.query.paginate(page_now, page_size, False) return server_page
db.session.add爲插入操做,db.session.delete爲刪除操做,query相關的爲查詢操做。SQLAlchemy框架底層調用了MySQL-python,並進行封裝,不用再使用sql語句對數據庫進行操做了。上述代碼有使用到一個server類,server類跟數據庫的servers表相對應,server類的定義和表的定義以下:python
class Server(db.Model): __tablename__ = 'servers' id = db.Column(db.Integer, primary_key=True) ip = db.Column(db.String(128), unique=True) hostname = db.Column(db.String(128)) cpu = db.Column(db.Integer) memory = db.Column(db.Integer) load = db.Column(db.String(128)) ulimit = db.Column(db.Integer) version = db.Column(db.String(128)) selinux = db.Column(db.String(128))
CREATE TABLE `servers` ( `id` int(6) NOT NULL AUTO_INCREMENT, `ip` varchar(128) DEFAULT NULL, `hostname` varchar(128) DEFAULT NULL, `cpu` int(3) DEFAULT NULL, `memory` int(8) DEFAULT NULL, `load` varchar(128) DEFAULT NULL, `ulimit` int(9) DEFAULT NULL, `version` varchar(128) DEFAULT NULL, `selinux` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ip` (`ip`) ) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
如上定義,基本可完成對數據的操做,但還有不少可優化的地方。mysql
前端代碼以下,現主要先分爲兩部分,一個是提交ip用來取ip的數據而後入庫的,另一個是分頁展現服務器的硬件信息(分頁的一些對象會在最後進行講解):linux
{% extends "basic.html" %} {% block page_content %} <form role="form" class="form-inline" method="post" action="/db/server/add"> <textarea class="form-control" rows="1" name="searchip" placeholder="請輸入ip"></textarea> <button type="submit" class="btn btn-default">提交</button> </form> <div style="height: 260px;"> <table class="table table-bordered"> <thead> <tr> <th>服務器ip</th> <th>主機名</th> <th>cpu內存</th> <th>負載</th> <th>資源數限制</th> <th>系統版本</th> <th>selinux狀態</th> <th>操做</th> </tr> </thead> <tbody> {% for server1 in object_list %} <tr> <td>{{ server1.ip }}</td> <td>{{ server1.hostname }}</td> <td>{{ server1.cpu }}核{{ server1.memory }}M</td> <td>{{ server1.load }}</td> <td>{{ server1.ulimit }}</td> <td>{{ server1.version }}</td> <td>{{ server1.selinux }}</td> <td><a href="/db/server/delete?ip={{ server1.ip }}"><span class="label label-warning">delete</span></a></td> </tr> {% endfor %} </tbody> </table> </div> <ul class="pagination"> {% if server_page.has_prev %} <li><a href="/db/server/query/page?page_now={{ server_page.prev_num }}">«</a></li> {% else %} <li class="disabled"><a href="#">«</a></li> {% endif %} {% for i in range(1, (server_page.pages + 1)) %} {% if i == server_page.page %} <li class="disabled"><a href="#">{{ i }}</a></li> {% else %} <li><a href="/db/server/query/page?page_now={{ i }}">{{ i }}</a></li> {% endif %} {% endfor %} {% if server_page.has_next %} <li><a href="/db/server/query/page?page_now={{ server_page.next_num }}">»</a></li> {% else %} <li class="disabled"><a href="#">»</a></li> {% endif %} </ul> {% endblock %}
輸入ip去提取服務器的硬件併入庫的操做的代碼以下(可輸入多個ip,但ip不能重複,這個能夠優化作個判斷,若是ip已存在,就更新數據庫的信息):sql
#服務器信息入庫 @app.route('/db/server/add', methods=['GET', 'POST']) def db_server_add(): ip = [] p = re.compile(r'(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)') if request.method == 'POST' and p.findall(request.form['searchip']): ip = p.findall(request.form['searchip']) for i in range(0, len(ip)): info = collect_info(ip[i], 'root', '/root/.ssh/id_rsa', 22) server1 = server.Server(ip=info['ip'], hostname = info['hostname'], cpu = info['cpuinfo'], memory = info['meminfo'], load=info['loadavg'], ulimit = info['ulimit'], version = info['release'], selinux = info['getenforce']) modules_db.server_add(server1) return render_template('200.html')
此代碼就直接使用collect_info收集遠程服務器的硬件信息,而後調用SQLAlchemy框架的db.session.add入庫。數據庫
另外,SQLAlchemy框架把分頁的功能弄得比較簡單,SQLAlchemy框架自身把當前頁,總頁數等都進行了封裝,分頁的代碼以下:flask
#服務器信息查詢分頁 @app.route('/db/server/query/page', methods=['GET', 'POST']) def db_server_query_page(): page_size = 6 server_page = modules_db.server_query_page(1, page_size) page_now = request.values.get('page_now') if page_now: server_page = modules_db.server_query_page(int(page_now), page_size) object_list = server_page.items return render_template('db/db_server_query_page.html', object_list = object_list, server_page = server_page)
SQLAlchemy框架的query.paginate有三個參數,第一個參數爲當前頁,第二個參數爲每一個頁的數據,第三個參數爲超出是否報錯。返回的server_page裏面包含有分頁的信息等,如server_page.items表明的是當前頁面的全部內容,須要在前端展現。再回到前端頁面能夠看到我有用到object_list把當前頁面的內容進行展示;server_page.pages提取分頁的總頁數;server_page.has_prev判斷是否有上頁,若是有,點擊顯示上一頁server_page.prev_num服務器
目前實現都是先從網上查詢到的一些知識,另外,SQLAlchemy官方文檔應該有更具體的使用說明能夠參考。網絡
最後附上本人的網絡課堂地址,若有興趣請點擊: 實踐哥