【问题标题】:Django how to serialize and validate external xml dataDjango如何序列化和验证外部xml数据
【发布时间】:2019-06-03 04:59:18
【问题描述】:

我在验证外部 xml 时遇到“问题”。我想要的是从外部 rss 站点获取数据,验证是否所有字段都存在,然后将其保存到数据库中。

我遇到的问题是我不确定如何将 xml 数据发送到我的验证器。我尝试了不同的方式,但没有奏效。

https://api.foxsports.com/v1/rss?partnerKey=zBaFxRyGKCfxBagJG9b8pqLyndmvo7UU&tag=nba

这是我尝试解析的 rss 示例。

这是我的代码:

    import json
import requests
import xml.etree.ElementTree as ET

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, generics

class Test(APIView):

    def get(self, request, format=None):


                response = requests.get(
                    channel.url
                )

                print(response.status_code)

                if response.status_code == 200:
                    xml = response.text.encode("utf-8")

                    tree = ET.fromstring(xml)

                    for child in tree.iter("item"):


                        serializer = RssSerializer(data=child)
                        if serializer.is_valid():
                            serializer.save(parsed_xml)

这里的问题是我的序列化器总是无效的,不管我做什么。当我编写一个从请求中手动提取字段的小帮助函数时,我有点解决了这个问题。

看起来像这样:

def parse_xml(self, node):

    parsed_json = {
        "title": node.find("title").text,
        "description": node.find("description").text,
        "link": node.find("link").text,
        "pub_date": node.find("pubDate").text,
        "guid": node.find("guid").text,
    }

    return parsed_json

基本上我只是添加了这一行 parsed_xml = self.parse_xml(child) 我正在将 parsed_xml 发送到我的序列化程序。这工作正常,但对我来说似乎是一种 hackhish 方式,但我无法以任何其他方式处理数据。

 class RssSerializer(serializers.Serializer):
    title = serializers.CharField(min_length=2)
    link = serializers.CharField(min_length=2)
    description = serializers.CharField(min_length=2)
    pub_date = serializers.CharField(min_length=2)
    guid = serializers.CharField(min_length=2)


    def save(self, data):
        new_feed = RssFeed()

        new_feed.title = data["title"]
        new_feed.description = data["description"]
        new_feed.pub_date = data["pub_date"]
        new_feed.link = data["link"]
        new_feed.guid = data["guid"]

        new_feed.save()

我想知道有什么方法可以从外部源获取 xml 并将其直接传递给我的验证器?提前感谢您的帮助

【问题讨论】:

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:

    序列化器不期望 xml 节点作为数据,所以简短的回答是否定的,不幸的是没有直接的方法将它传递给验证器。但是,您可以重用现有方法之一来将整个 xml 更改为字典,然后将项目提供给序列化程序,或者将单个节点更改为字典。

    为了获得灵感,我会研究可用的解决方案(无需重新发明轮子):

    例如您的代码可能如下所示:

    xml = response.text.encode("utf-8")
    xml_dict = xmltodict.parse(xml)
    for item in xml_dict["rss"]["channel"]["item"]:
        serializer = RssSerializer(data=item)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2011-04-20
      • 2020-08-14
      • 2016-08-11
      • 1970-01-01
      相关资源
      最近更新 更多