【问题标题】:Assigning variables from XML returned from an API call从 API 调用返回的 XML 分配变量
【发布时间】:2010-11-12 15:41:55
【问题描述】:

我需要从 API 中提取一些数据。它以 XML 格式返回 GET,我在试图弄清楚如何将 API 中的一些数据分配给 django/python 模型中的字段时遇到了一些问题。

activeCollab 的 API 不允许我创建自己的 projectID 编号,它会自动为我生成编号。所以我想拿那个号码,然后把它分配给我的项目模型中的 API_id 字段。有人可以帮我弄清楚如何获取 GET 返回的 XML 并将其分配给我的一个字段。

项目的 ActiveCollab API 文档: http://www.activecollab.com/docs/manuals/developers/api/projects

这是我的models.py

class Project(models.Model):
client = models.ForeignKey(Clients, related_name='projects')
created_by = models.ForeignKey(User, related_name='created_by')


#general information
API_id = models.IntegerField(max_length=10, verbose_name='aC ProjectID', null=True, blank=True)
proj_name = models.CharField(max_length=255, verbose_name='Project Name')
pre_quote = models.CharField(max_length=3)
quote = models.IntegerField(max_length=10, verbose_name='Quote #', unique=True)
estimator = models.ForeignKey(User, related_name='Estimator', null=True)
desc = models.TextField(verbose_name='Description', null=True, blank=True)
starts_on = models.DateField(verbose_name='Start Date')
due_date = models.DateField(verbose_name='Due Date', null=True, blank=True)
completed_on = models.DateField(verbose_name='Finished On', null=True, blank=True)
notes = models.TextField(verbose_name='Notes', null=True, blank=True)

Views.py

def addProject(request):
if request.method == 'POST':
    form = AddSingleProjectForm(request.POST)
    if form.is_valid():
        project = form.save(commit=False)
        project.created_by = request.user 
        today = datetime.date.today()
        project.pre_quote = "%s-" % (str(today.year)[2:4])
        project.quote = Project.objects.latest().quote+1
        project.save()

        project.status.create(
                value = form.cleaned_data.get('status', None)
        )            

        #API activeCollab
        params = urllib.urlencode({
              'format':'xml',
              'submitted':'submitted',
              'project[name]': project.proj_name,
              'project[overview]': project.desc,
              'project[starts_on]': project.starts_on,
              'project[leader_id]': 10,
        })
        req = urllib2.Request("web_url/public/api.php?path_info=/projects/add&token=####################", params)
        f = urllib2.urlopen(req)
        print f.read()


        return HttpResponseRedirect('/project/')
else:
    form = AddSingleProjectForm()

return render_to_response('project/addProject.html', {
'form': form, 'user':request.user}, context_instance=RequestContext(request))

任何建议将不胜感激。

史蒂夫

附言。我展示的api调用是创建一个新项目

【问题讨论】:

  • 您的问题到底是什么?您似乎很高兴提交请求并返回 XML。你在哪方面有问题?
  • 那部分工作正常,但问题是项目 ID 不同。 activeCollab 中的 ID 与我的 django 项目中的 ID 不同。因此我无法弄清楚如何进行编辑调用或删除调用,因为 ID 不同。

标签: python xml django api activecollab


【解决方案1】:

查看您发布的链接...类似这样的内容可能会让您开始使用 lxmlxpath

>>> from lxml import etree
>>> doc = etree.XML("""<projects>
...   <project>
...     <id>1</id>
...     <name>
...       <![CDATA[First Project]]>
...     </name>
...     <overview>
...       <![CDATA[<p>This is overview of the first project</p>]]>
...     </overview>
...     <status>
...       <![CDATA[active]]>
...     </status>
...     <type>...</type>
...     <permalink>...</permalink>
...     <leader_id>...</leader_id>
...     <company_id>...</company_id>
...     <group_id>...</group_id>
...   </project>
... </projects>""")
>>> data = {}
>>> for a in doc.xpath('/projects/project/*'):
...   data[a.tag] = str(a.text).strip()
...
>>> data
{'company_id': '...',
 'group_id': '...',
 'id': '1',
 'leader_id': '...',
 'name': 'First Project',
 'overview': '<p>This is overview of the first project</p>',
 'permalink': '...',
 'status': 'active',
 'type': '...'}

更新

稍微更明确的帮助:

假设您的文件中有from lxml import etree。这是您的addProject 函数的 sn-p:

req = urllib2.Request("web_url/public/api.php?path_info=/projects/add&token=####################", params)
resp = urllib2.urlopen(req)
resp_data = f.read()
if not resp.code == 200 and resp.headers.get('content-type') == 'text/xml':
  # Do your error handling.
  raise Exception('Unexpected response',req,resp)
data = etree.XML(resp_data)
api_id = int(data.xpath('/project/id/text()')[0])
project.API_id = api_id
project.save()

【讨论】:

  • 嘿,MattH 我在安装 lxml 时遇到了一些问题,您能就这个问题提供任何帮助吗?
  • 它告诉我模块不存在?
  • 我尝试安装该模块,但我认为我做得不对。
  • 可能最好开始一个关于模块安装的新问题。
  • 好的,在我开始另一个问题之前我会做更多的研究
猜你喜欢
  • 2013-06-05
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多