2010-11-12 27 views
1

我需要從API中提取一些數據。它返回XML中的GET,並且我有一些問題試圖找出如何將API中的一些數據分配給django/python模型中的字段。從API調用返回的XML中分配變量

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)) 

任何建議將不勝感激。

Steve

Ps。我所顯示的API調用來創建一個新項目

+0

到底是什麼問題了嗎?您提交請求並返回XML似乎很滿意。你有什麼問題? – 2010-11-12 15:48:24

+0

該部分正在工作,但事情是項目ID是不同的。 activeCollab中的ID與我的django項目中的ID不同。因此我不知道如何編輯呼叫或刪除呼叫,因爲ID不一樣。 – TheLifeOfSteve 2010-11-12 15:49:47

回答

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函數的代碼段:

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() 
+0

非常感謝你MattH! – TheLifeOfSteve 2010-11-15 14:13:17

+0

嗨馬特我有一些問題得到lxml安裝,你能夠提供任何幫助在這個問題上? – TheLifeOfSteve 2010-11-15 14:49:16

+0

有什麼問題? – MattH 2010-11-15 16:35:49

相關問題