将多级dict从python应用程序发布到python webservice

时间:2014-02-20 09:26:52

标签: python django

我正在开发一个自动化脚本(我用它来自动化某些视频的转换过程)。在视频转换后的这个脚本中,我正在调用我的Web服务来更新数据库中的剪辑状态,并在POST请求中向Web服务发送一个剪辑列表。但问题是此请求失败并导致服务器端出现500内部服务器错误。

以下是我用来调用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

以下是我的网络服务代码:

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)

即使是第一个print语句也没有执行。

以下是应用程序端的错误堆栈跟踪:

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)

1 个答案:

答案 0 :(得分: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)