django下载支持XML格式开发

发布时间丨2022-08-25 15:09:12作者丨zhaomeng浏览丨16


业务有所需求,能够跟着需求学习提升技能,本篇博文记录分享使用django生成xml格式,并支持后台下载的指定字段的功能开发,首先就是要理解xml的格式怎么用python3实现,如何实现成需要的模板xml格式,查阅资料,尝试了几个,最终取多家之长,完成xml格式的模板生成,生成的模板如下图所示:

第一步:下面介绍如何使用python3实现xml格式的模板,并保存为xml格式,代码如下所示,简单介绍下每行代码:

import xml.etree.ElementTree as ET
def get_xml(data):
    my_xml = ET.Element('urlset', attrib={'xmlns': 'http://www.sitemaps.org/schemas/sitemap/0.9'})
    for ss in data:
        url_element = ET.SubElement(my_xml, "url")
        loc = ET.SubElement(url_element, "loc")  # 地址
        loc.text = ss.get("loc")
        changefreq = ET.SubElement(url_element, "changefreq")
        changefreq.text = 'daily'
        lastmod = ET.SubElement(url_element, "lastmod")  # 时间
        lastmod.text = ss.get("lastmod")
        priority = ET.SubElement(url_element, "priority")
        priority.text = '0.5'

    my_str = ET.tostring(my_xml, 'utf-8', short_empty_elements=False)
    head = '<?xml version="1.0" encoding="UTF-8"?>'
    return head + my_str.decode("utf-8")


if __name__ == '__main__':
    data = [{"url": "https://www.mreda.com.cn/wzwenqax7xx1a/wdtavqnt.html", "update_time": "2022年8月25日"},
            {"url": "https://www.mreda.com.cn/wzwenqax7xx1a/1.html", "update_time": "2022年8月26日"}]
    s = get_xml(data)
    # s = export_xml(data, columns=["url", "update_time"])
    print(s)
    with open("./file1.xml", "a+", encoding='utf-8') as f:
        f.write(s)

ET.Element():生成跟节点urlset

attrib:字典类型生成节点的属性和值

ET.SubElement():生成嵌套父节点的子节点url,父节点为my_xml

loc.text="111":给节点loc赋值111

如果需要生成多个url节点,添加for循环即可

第二步:实现django下载xml的utils工具开发,代码详细介绍如下:

import datetime
import xml.etree.ElementTree as ET
import xlwt
from django.http import FileResponse


def file_iterator(filename, chuck_size=512):
    """
    将文件分块返回
    :param filename: 文件名称
    :param chuck_size: 块的大小,默认 512
    :return: 文件以可迭代对象的方式分块返回
    """
    with open(filename, "rb") as f:
        while True:
            c = f.read(chuck_size)
            if c:
                yield c
            else:
                break

def export_xml(queryset, columns, filename='file_name'):

    my_xml = ET.Element('urlset', attrib={'xmlns': 'http://www.sitemaps.org/schemas/sitemap/0.9'})
    # print(columns)
    for query in queryset.values(*columns):
        # print("-"*20)
        # print(query)
        url_element = ET.SubElement(my_xml, "url")
        for i, k in enumerate(columns):
            if k == "url":
                loc = ET.SubElement(url_element, "loc")  # 地址
                loc.text = query.get(k)
                changefreq = ET.SubElement(url_element, "changefreq")
                changefreq.text = 'daily'
            if k == "update_time":
                v = query.get(k)
                if isinstance(v, datetime.datetime):
                    v = v.strftime('%Y-%m-%d %H:%M:%S')
                if isinstance(v, datetime.date):
                    v = v.strftime('%Y-%m-%d')
                lastmod = ET.SubElement(url_element, "lastmod")  # 时间
                lastmod.text = v
                priority = ET.SubElement(url_element, "priority")
                priority.text = '0.5'
    my_str = ET.tostring(my_xml, 'utf-8', short_empty_elements=False)
    head = '<?xml version="1.0" encoding="UTF-8"?>'
    # return head + my_str.decode("utf-8")
    with open(filename, "a+", encoding='utf-8') as f:
        f.write(head + my_str.decode("utf-8"))

    response = FileResponse(file_iterator(filename))
    response['Content-Type'] = 'text/xml'
    response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
    return response

参数介绍:

queryset为django的查询集合

colums为获取下载的字段即models.py定义的

filename为文件下载的路径

file_iterator()函数为文件分快的方式返回,获取文件流

Content-Type为文件的格式这里是xml

第三步:配置app的admin.py文件添加下载的动作及参数我这里主要获取两个参数生成xml

在注册的Admin类中添加函数如下:

    def save_xml(self, request, queryset):
        filename = r'media/{0}_{1}.xml'.format('UselessXML', datetime.datetime.now().strftime('%Y%m%d%H%M%S'))

        columns = ["url", "update_time"]
        return export_excel.export_xml(queryset, columns, filename)

    save_execl.short_description = "导出数据EXCEL"
    save_xml.short_description = "导出数据XML"
    actions = [save_execl, save_xml]

参数介绍:

filename:下载的文件路径

columns:获取下载的字段

export_excel.export_xml():调用上面的函数生成xml文件下载

save_xml.short_description = "导出数据XML":为函数添加动作描述
actions = [save_execl, save_xml]:将函数添加为后台动作事件

进入后台刷新页面出现如下所示的图标就成功了!

 

推荐文章:CAS号验证算法编写及测试