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]:将函数添加为后台动作事件
进入后台刷新页面出现如下所示的图标就成功了!