title: 模擬上傳multipart/form-data/指令碼生成時間軸 date: 2018-05-11 00:51:27 tags: multipart/form-data
模擬上傳multipart/form-data,指令碼生成時間軸
首先是時間軸的指令碼
最終效果 首先前端程式碼是找的模板,懶省事但是歷史線文字是需要我們來填補的吧 工作室歷史線比較長,也不可能手動來搞~~~~
)分下原始碼,我們就可以整理下思路,我們現在要做的就是讀取整理好的歷史文字里的內容 然後生成html內容,因為這個模板每個歷史展現是相同的,只是item代號不同,也只是分為兩種 一開始為了方便,我直接生成html文字,然後手動加到了靜態檔案history.html裡面 (運營整理好的是word,對程式碼的讀取不太友好,我就生成了txt文字,然後手動整理成下面的格式
很顯然,可以直接用python進行O/I操作,這裡你會遇到一些轉碼的錯誤 搜尋一下應該就能解決了(至於搜尋花費的時間看臉。。。。。。)
i = 0
result =''
with open('data/timeline.txt','r', encoding='UTF-8') as file:
lines = file.readlines()
while i < len(lines):
result += '<div class="timeline__item timeline__item--'+str(int(i/2)+1)+' timeline__item-bg">'+'\n'+'<div class="timeline__item__station"></div>'+'\n'+'<div class="timeline__item__content">' + \
'\n'+'<h2 class="timeline__item__content__date">' + \
lines[i]+"</h2>"+'\n'+'<p class="timeline__item__content__description">' + \
lines[i+1]+'</p>'+'\n'+"</div>"+'\n'+"</div>"
i += 2
file.close()
複製程式碼
這裡解釋一下~ 我們的流程是讀出資料,然後得出總的資料長度進行遍歷 再用字串的形式串接html程式碼,其中timeline_item指定顏色,由於我們一條歷史分為兩行 我們需要timeline_item為1,2,3,4,。。。。。這樣通過數學知識可以輕鬆得到我們需要指定(i/2)+1 然後lines[i]和lines[i+1]就很清楚了,一條歷史佔兩行
然後一開始我是生成存到另一個txt文字再貼上到html,後來還是介面方便,可以直接讀取上傳的歷史的txt就可以自動生成html 現在工作室需要的小的介面,我都寫到了homepageserver裡面,這個也一樣,生成json介面,前端js處理一下以後就可以只更新txt文字自動生成時間線了
還有就是我在瀏覽的時候,從上到下,很難看到最新的歷史,我就想倒序展示時間線,把最新的歷史放到首處 查了好多,最後得出感覺最優雅的倒序讀取文字方式 file.readlines()[::-1] orzzzzzzz,原諒我一開始沒想到這種方式////////////
PS:程式碼已經在github了
PPT批量上傳的指令碼
ppt上傳處是form表單提交,但是又和平常遇到的python表單不同,是屬於multipart/form-data 是將檔案以二進位制的形式上傳,這樣可以實現多種型別的檔案上傳 這時候我們會首先想到requests庫來模擬瀏覽器上傳檔案 但是在這裡對於這種形式的上傳,用requests另一個工具庫requests_toolbelt更為方便(這是查了一個下午的結論) 專門針對multipart/form-data這種上傳
title = os.path.splitext(file)[0] #獲取檔名
houzhui = os.path.splitext(file)[1] #獲取字尾
open_file = basedir + '/' + file_dir + '/' + file
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0'}
multipart_encoder = MultipartEncoder(
fields={
'title': title,
'cate': str(cate_id),
'type': str(type_id),
'status': str(1),
'file': ('file' + houzhui, open(open_file, 'rb'))}
)
headers['Content-Type'] = multipart_encoder.content_type
upload = requests.post("https://ppt.atcumt.com/file",
data=multipart_encoder, headers=headers)
複製程式碼
這裡哦我們需要注意幾點:一點是這個庫原始碼會將引數encoder,這時候int是不允許作為引數的,所以有了str(1) 更為重要的一點,官方文件指出file的鍵值是(檔名,open(檔案路徑,'開啟方式')) 但是我在實施過程中執行指令碼一直提示沒有檔案,最後經過很漫長很漫長的搜尋後,我正在進入流程原始碼除錯 邢組發現檔名只能是英文...............然後解決了,用了指定'file’加字尾的形式,反正最後顯示的title 是引數title的鍵值
對於requests,當時也使用的中文,一直失敗,用了這個他的另一個擴充庫,如果requests用下面的方式 也是英文檔名字的話不知道會不會成功?我沒有再去實踐... (不過requests似乎已經說明對於這種multipart上傳用requests_toolbelt更合適)
data = {
# 標題等引數
}
file = {
filename : open(open_file,'rb')
}
# 然後requests.post
複製程式碼
PS:實際上整個文章技術含量不高,恩,我可能是想表達,以後要想起來利用技術簡化一些事情