Python實現小型信息管理系統踩過的坑(更新中)

一、同一目錄下的py文件無法互相調用

自檢查發現是文件路徑問題。如下圖的目錄架構下,在views.py文件中調用db.py文件中的類或函數。
圖1.1
首先如下圖設置根目錄,默認是當前已配置環境的Python項目根目錄。
圖1.2
如下圖,按照已設置的根目錄下的文件相對路徑進行引入即可。
圖1.3

二、flask的自動渲染路徑

簡單寫法如下,render_template的參數中,第一個參數爲前端模板,後繼參數均爲模板中待填充的部分。
這一部分等具體化再補充。
在這裏插入圖片描述

三、layui的表格參數傳遞

前端等待後臺數據的表格設置:

// 參考layui文檔
<table class="layui-hide" id="spideuser" lay-filter="test"></table>

前端JavaScript:

// 參考layui文檔
table.render({
    elem: '#spideuser'
    , height: 420
    , url: '/spideuser/json/' //數據接口
    , title: '備選用戶表'
    , cols: [[ //表頭
        {type: 'checkbox', fixed: 'left', width: 250}
        , {field: 'name', title: '暱稱', align: 'center', width: 485}
        , {field: 'type', title: '類別', align: 'center', width: 485}
    ]]
});

// 處理複選框選中數據
table.on('checkbox(test)', function(obj){
    datas.push(obj.data); // 向列表中添加選中行數據
});

數據接口即爲表格需要的JSON數據所在的URL,可在後臺通過函數生成。

""" 同樣參考layui的demo表格的JSON數據格式 """
# 備選數據的json
@main.route('/spideuser/json/')
def data_to_json():
    d = DBlink()
    d.conndb()
    cname = d.selectAllUser()
    d.closedb()
    datalist = []
    for name in cname:
        data = {'name': name[0], 'type': name[1]}
        datalist.append(data)

    jsdata = {"code": 0, "msg": "", "count": 1000, "data": datalist}

    return jsonify(jsdata)

將前端數據傳到後端:

function spaction(){
    var ajax = XMLHttpRequest();
    ajax.open( "post" , '/spideuser' , true );
    ajax.setRequestHeader( "Content-Type" , "application/json" );
    ajax.onreadystatechange = function () {
        if( ajax.readyState == 4 ) {
            if( ajax.status == 200 ) {
                msg.innerHTML = ajax.responseText;
            }
            else {
                msg.innerHTML = "HTTP請求錯誤!錯誤碼:" + ajax.status;
            }
        }
    };

     // 必須要使用函數JSON.stringify將數據格式改爲JSON,否則後臺只能接收到Object字符串
    ajax.send( JSON.stringify(datas) ); 
}

在後臺再對數據進行轉碼即可。

四、微博線程池爬蟲遇到的問題

1. 多線程時隨機報錯

檢查發現一個問題是微博的時間顯示,2020年顯示的是xx月xx日 hh:mm的格式;而2019年及之前是標準的datetime格式。另一個問題是,微博的設備不一定可見。

2. 線程池的最大線程數必須大於爬取微博頁數

修改代碼後解決。目測應該是多線程瀏覽器響應速度問題。

五、數據庫操作遇到的問題

1. 插入操作錯誤

將爬取到的博文數據插入數據庫時報錯:

pymysql.err.InternalError: (1366, “Incorrect string value: ‘\xF0\x9F\x97\x93 \xE4…’ for column ‘博文內容’ at row 30”)

查詢資料發現應該是數據庫編碼問題,因爲部分特殊編碼是4字節,而utf8只有3字節,需要使用utf8mb4進行編碼。因此需要對錶編碼進行修改,同時相應字段編碼也必須修改。
在這裏插入圖片描述
2. 查詢操作錯誤

使用語句 sql = “SELECT * FROM 話題博文表 WHERE 話題 = %s AND 時段 LIKE ‘%分鐘%’ ORDER BY 綜合得分 DESC LIMIT 1” 進行查詢操作時,報錯:TypeError: not enough arguments for format string。
而使用語句 sql = “SELECT 話題, COUNT(*) AS 實時數量 FROM 話題博文表
WHERE 時段 LIKE ‘%分鐘%’ AND 類別 = ‘實時’ GROUP BY 話題 ORDER BY 實時數量 DESC” 進行查詢操作時,未報錯。

報錯說明運行sql時參數不夠。但實際上檢查兩條語句發現,第一條語句還有%s作爲sql的參數,而'%分鐘%'的格式與%s類似,可知%是一個轉義符號,則在第一條sql語句中使用%%表示%
修改後的sql語句爲:

sql = "SELECT * FROM 話題博文表 WHERE 話題 = %s AND 時段 LIKE '%%分鐘%%' ORDER BY 綜合得分 DESC LIMIT 1"

再次運行後成功。

參考文章

[1] https://blog.csdn.net/weixin_33937499/article/details/85961463
[2] https://www.layui.com/doc/
[3] https://blog.csdn.net/genglukuan/article/details/89328477

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章