zoukankan      html  css  js  c++  java
  • 模拟上传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:实际上整个文章技术含量不高,恩,我可能是想表达,以后要想起来利用技术简化一些事情

  • 相关阅读:
    js对select动态添加和删除OPTION
    文本框textarea实时提示还可以输入多少文字
    JavaScript中统计Textarea字数并提示还能输入的字符
    inupt textarea提示文字(点击消失,不输入恢复)
    inupt textarea提示文字(点击消失,不输入恢复)及限制字数
    Server.MapPath()获取本机绝对路径
    cocos基础教程(12)点击交互的三种处理
    cocos基础教程(9)声音和音效
    cocos进阶教程(2)多分辨率支持策略和原理
    cocos基础教程(10)纹理缓存技术
  • 原文地址:https://www.cnblogs.com/bay1/p/10982524.html
Copyright © 2011-2022 走看看