模拟上传multipart/form-data/脚本生成时间轴

模拟上传multipart/form-data,脚本生成时间轴

首先是时间轴的脚本

最终效果
首先前端代码是找的模板,懒省事但是历史线文字是需要我们来填补的吧
工作室历史线比较长,也不可能手动来搞~~~~

分下源代码,我们就可以整理下思路,我们现在要做的就是读取整理好的历史文本里的内容
然后生成html内容,因为这个模板每个历史展现是相同的,只是item代号不同,也只是分为两种
一开始为了方便,我直接生成html文本,然后手动加到了静态文件history.html里面
(运营整理好的是word,对代码的读取不太友好,我就生成了txt文本,然后手动整理成下面的格式

QQ图片20180509001033.png
)

很显然,可以直接用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">'+'
'+'<div class="timeline__item__station"></div>'+'
'+'<div class="timeline__item__content">' + 
                '
'+'<h2 class="timeline__item__content__date">' + 
                lines[i]+"</h2>"+'
'+'<p class="timeline__item__content__description">' + 
                lines[i+1]+'</p>'+'
'+"</div>"+'
'+"</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:实际上整个文章技术含量不高,恩,我可能是想表达,以后要想起来利用技术简化一些事情

原文地址:https://www.cnblogs.com/bay1/p/10982524.html