如何讓python的json包序列化datetime
- 使用場景:通過pymysql獲得的數(shù)據(jù)庫中的datetime類型數(shù)據(jù)(在我們的開發(fā)中,一般是由models的DateTimeField創(chuàng)建的)赡模,會轉(zhuǎn)換為python的datetime.datetime類型并存放在元組中花嘶。我們需要對這個元組序列化粱哼,并發(fā)送到前端。
- 遇到問題:json.dumps不能序列化datetime類型,這這主要是因?yàn)镴SON本來就沒有時間類型棠众。關(guān)于JSON的數(shù)據(jù)類型說明請看
[]https://blog.csdn.net/u012843873/article/details/79699955 - 分析json.dumps的原理:分兩步撰豺。首先它使用一個編碼器JSONEncoder的default方法將數(shù)據(jù)的原始數(shù)據(jù)類型轉(zhuǎn)換成python中可以直接jsonfy的數(shù)據(jù)類型粪般。然后再使用底層方法轉(zhuǎn)換成JSON字符串。
- 解決問題:json.dumps支持使用一個自定義編碼污桦,對原編碼器JSONEncoder進(jìn)行擴(kuò)展亩歹。我們只需要重寫default方法將datetime轉(zhuǎn)成string類型即可。代碼如下:
import datetime
import json
class CustomEncoder(json.JSONEncoder):
"""自定義編碼器凡橱,對原編碼器進(jìn)行擴(kuò)展"""
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, datetime.date):
return obj.strftime('%Y-%m-%d')
else:
return super().default(self, obj)
dt1 = datetime.datetime(2018, 8, 1, 10, 6, 1)
tup1 = (1, '666', dt1)
tup1_json = json.dumps(tup1, cls=CustomEncoder)
print(tup1_json)
打印結(jié)果為:[1, "666", "2018-08-01 10:06:01"]
我們可以看到小作,時間被順利序列化了。
如何解決模態(tài)框打開關(guān)閉時界面左右抖動的問題
模態(tài)框打開時會對body添加一個modal-open的類稼钩,使body的overflow設(shè)為hidden顾稀。這時如果界面本身有滾動條就會因?yàn)闈L動條消失而整體向右滑動。在關(guān)閉模態(tài)框時坝撑,這個類會刪除静秆,body又恢復(fù)了原來的overflow屬性粮揉,滾動條又會加上。這里介紹一個比較簡單的解決問題的方法:對body的overflow設(shè)定一個優(yōu)先級更高的overflow抚笔,使其的值不會因?yàn)樵黾觕lass而改變扶认。CSS選擇器的優(yōu)先級為:
- 通用選擇器(*) < 元素(類型)選擇器 < 類選擇器 < 屬性選擇器 < 偽類 < ID 選擇器 < 內(nèi)聯(lián)樣式
以下按順序?qū)@7樣舉例:
*{width:100px}
img{width:450px}
.img{width:400px;}
img[alt="img"] {width:300px}
img:hover{width:350px}
#img{width:250px;}
<img src="images/icon.png" class="img" id="img" alt="img" style="width:50px" />
顯然,我們可以通過內(nèi)聯(lián)樣式的方法一步到位塔沃。在JS開頭加入如下代碼即可解決問題蝠引。
$('body').css({
'overflow': 'auto'
});
一種新的遍歷數(shù)組的方法:
var to = '';
// 這是第1種方法
$(to_list).each(function (index, value) {
to += value + ','
});
// 這是第2種方法
for (var i=0; i<to_list.length; i++) {
to += to_list[i] + ','
}
to = to.substr(0, to.length-1);
其中第1種是新學(xué)的,比第2種簡潔蛀柴。在遍歷數(shù)組的所有值時螃概,我將更多地使用第1種方法。但是第1種會改變$(this)的值鸽疾。如果有在方法開頭就使用變量引入$(this)的習(xí)慣吊洼,可以不用考慮這個問題。
如何讓內(nèi)部文字不可超出制肮,如果超出則顯示省略號
<button class="btn" style="width: 80%;
overflow: hidden; max-width: 80%; text-overflow: ellipsis; border-right: 1px solid #AAAAAA">
其中:
- overflow: hidden表明超出部分不顯示
- max-width限定元素的最大寬度冒窍,確保不會被文字撐開
- text-overflow: ellipsis表示超出的文字顯示省略號
- 3項(xiàng)屬性必須同時使用,一個也不能少
讓模態(tài)框上下居中的方法
// 使模態(tài)框處在屏幕的中偏上一點(diǎn)點(diǎn)的地方
var window_height = $('#delete_modal').height();
var modal_height = $('#delete_modal .modal-dialog').height();
// 180918LLR豺鼻,先取到整百再-100再除以2综液,為的是能更多地向上偏。太裝B了儒飒!
var margin_top = (parseInt(window_height / 100) * 100 - modal_height - 100) / 2;
$('#delete_modal .modal-dialog').css('margin-top', margin_top+'px');
注意:window_height可以自動獲得谬莹,但是modal_height始終是0,必須由用戶觀察后自己對dialog加一個高度樣式桩了。