Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django如何序列化和验证外部xml数据_Python_Django_Django Models_Django Rest Framework_Django Serializer - Fatal编程技术网

Python Django如何序列化和验证外部xml数据

Python Django如何序列化和验证外部xml数据,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,我在验证外部xml时遇到“问题”。我想要的是从外部rss站点获取数据,验证是否存在所有字段,然后将其保存到数据库中 我遇到的问题是,我不确定如何将xml数据发送到验证器。我尝试了不同的方法,但都不管用 这是我试图解析的rss的一个示例 这是我的密码: import json import requests import xml.etree.ElementTree as ET from rest_framework.views import APIView from rest_fram

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

我遇到的问题是,我不确定如何将xml数据发送到验证器。我尝试了不同的方法,但都不管用

这是我试图解析的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
xml = response.text.encode("utf-8")
xml_dict = xmltodict.parse(xml)
for item in xml_dict["rss"]["channel"]["item"]:
    serializer = RssSerializer(data=item)
基本上我只是添加了这一行parsed_xml=self.parse_xml(child) 我将解析后的xml发送到我的序列化程序。这很好,但对我来说似乎是一种骇客的方式,但我无法以任何其他方式处理数据

 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并直接将其传递给我的验证器?提前感谢您的帮助

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

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

  • 这个问题已经触及

  • 我曾经使用过这个DRF XML解析器来解析XML请求,它完成了以下工作:

  • 如果您不介意增加库,xmltodict也为我解决了类似的问题

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

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
xml = response.text.encode("utf-8")
xml_dict = xmltodict.parse(xml)
for item in xml_dict["rss"]["channel"]["item"]:
    serializer = RssSerializer(data=item)