2014-02-20 32 views
0

我正在使用自動化腳本(我正在使用它來自動化某些視頻的轉換過程)。在此視頻轉換後的腳本中,我打電話給我的Web服務來更新數據庫中的剪輯狀態,並在POST請求中向Web服務發送剪輯列表。但問題是這個請求失敗,並在服務器端導致500內部服務器錯誤。從python應用程序到python webservice發佈多級字典

這裏是我使用的調用與樣本數據的Web服務,我試圖與代碼:

post_body = { 
     'clips': [ 
      { 
       'clip_id': 17555, 
       'db_url': '/720p/14555.mp4' 
      } 
     ] 
    } 
    params = urlencode(post_body) 
    url = str(self.update_url) 
    req = urllib2.Request(url, params) 
    response = urllib2.urlopen(req) 
    res = response.read() 
    print res 

,這裏是我的web服務的代碼:

def update_conversion_clips(request): 
    print "Web service is called" 
    try: 
     clips = request.POST.get('clips', None) 
     print clips 
     return HttpResponse(True) 
    except: 
     return HttpResponse(False) 

即使第一打印語句不執行。

這裏是應用端的錯誤堆棧跟蹤:

Traceback (most recent call last): 
File "conversion_script.py", line 48, in <module> 
    conversion_script.run() 
File "conversion_script.py", line 44, in run 
    self.clips.update_clips_info(None) 
File "/home/abc/video_experiments/conversion/clips_manager.py", line 59, in update_clips_info 
    response = urllib2.urlopen(req) 
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
File "/usr/lib/python2.7/urllib2.py", line 406, in open 
    response = meth(req, response) 
File "/usr/lib/python2.7/urllib2.py", line 519, in http_response 
    'http', request, response, code, msg, hdrs) 
File "/usr/lib/python2.7/urllib2.py", line 444, in error 
    return self._call_chain(*args) 
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain 
    result = func(*args) 
File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 500: INTERNAL SERVER ERROR 

,這是服務器端的錯誤:

[20/Feb/2014 04:13:15] "POST /update_conversion_clips HTTP/1.1" 500 68733 

根據我的研究,這是發生由於多級字典,我發送POST。但我找不到解決它的任何解決方案。

新代碼發送數據作爲JSON(仍然不工作):

values = dict() 
values['clips'] = [ 
    { 
     'clip_id': 17555, 
     'db_url': '/720p/14555.mp4' 
    } 
] 
req = urllib2.Request(self.update_url) 
req.add_header('Content-Type', 'application/json') 
response = urllib2.urlopen(req, json.dumps(values)) 
res = response.read() 
print res 

,並在服務器端:

try: 
    data = json.loads(request.body) 
    clips = data['clips'] 
except: 
    print "Exception occured!" 
HttpResponse(True) 

回答

0

進行urlencode是不是真的對這個數據的好形式。更好的是JSON。

req = urllib2.Request(self.update_url) 
req.add_header('Content-Type', 'application/json') 

response = urllib2.urlopen(req, json.dumps(data)) 
print response.read() 

(你可以做這部分很多使用第三方requests庫簡單)。

而在服務器:

clips = json.loads(request.body) 
+0

thanx您的回覆!我試着按照你的建議使用新代碼,但它仍然給我提供了同樣的錯誤,即500內部服務器錯誤!我還在編輯中添加了新代碼。 –

+0

請注意,請不要捕獲所有異常,只需打印「發生異常」。這完全適得其反。讓Python向您展示錯誤,然後我們將知道實際發生了什麼問題以及如何解決問題。 –

+0

我嘗試沒有嘗試趕上,但它並沒有顯示任何異常在服務器端! 「[24/Feb/2014 06:05:06]」POST/content/update_conversion_clips HTTP/1.1「500 68889 」我認爲在我看來沒有錯誤,因爲甚至沒有第一個代碼語句的視圖被執行。 –