我需要从 API 中提取一些数据。它以 XML 形式返回 GET,我在尝试弄清楚如何将 API 中的一些数据分配到 django/python 模型中的字段时遇到了一些问题。
activeCollab 的 API 不允许我创建自己的项目 ID 编号,它会自动为我生成该编号。所以我想获取该数字,然后将其分配给我的项目模型中的 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)
View .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 调用是创建一个新项目
最佳答案
查看了您发布的链接...类似的内容可能会帮助您开始使用 lxml
和 xpath
:
>>> 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
函数的代码片段:
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()
关于python - 从 API 调用返回的 XML 中分配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4166291/