2012-02-10 218 views
0

我想从一个python脚本发送POST数据到一个url。下面是代码:Python POST不起作用

def createperson(self,name=None): 
     SERVER_BASE_ADDR = 'http://localhost:8000/' 
     postdata = urllib.urlencode({'name':name}) 
     req = urllib2.Request(SERVER_BASE_ADDR + 'people/add') 
     fd = urllib2.urlopen(req,postdata) 
     return name 

但这返回

HTTPError: HTTP Error 500: INTERNAL SERVER ERROR 

添加一个人的网址是好的。有任何想法吗?

编辑

服务器端使用Django的装饰来处理POST和GET。

@require_http_methods(["GET", "POST"]) 
def add(request): 
     if request.method == "POST": 
      #do stuff with post data 

是不是上面的Python代码提交HTML模板上的表单相同?如果它一样,那么处理程序不应该以相同的方式处理它?

谢谢

解决使用:

c = urllib2.build_opener() 
postdata = urllib.urlencode({'name':name}) 
r = c.open(url,postdata) 

一种不同的方法,但做这项工作。感谢您的答复。

+0

你用什么来处理服务器端的请求?它需要一个尾部斜线/?您的服务器是否会提供有关为什么它的请求失败的任何反馈? – jdi 2012-02-10 15:30:09

回答

2

HTTP 500错误意味着问题不会发生在客户端python脚本上,而是发生在服务器端。

检查您的服务器端代码,也许它只从GET读取数据,而不是POST。

+0

请查看问题中的编辑。我有Django装饰器来处理POST和GET请求 – Neeran 2012-02-10 15:39:48

+0

对不起,我对django很新,但我建议你打印(或记录)发布的数据。如果数据发布成功,那么它必须是服务器端代码。 – adamsmith 2012-02-10 15:53:22

2

HTTP 500错误肯定是内部服务器错误。正如@dlutxx指出的那样,服务器上出现问题。

要进一步调试,我认为你应该检查你的Django处理程序。如果它确实对GET请求有效,但对POST请求不起作用,那么可能应该查看GET处理程序和POST处理程序之间的不同之处。

import logging 

logger = logging.getLogger(__name__) 

@require_http_methods(["GET", "POST"]) 
def add(request): 
    try: 
     if request.method == "POST": 
      # Something is probably broken here. 
     elif request.method == "GET": 
      # But apparently works fine here. 
    except: 
     # Why don't we insert some debugging output to try to catch it. 
     logger.exception("Problem in add handler") 
     raise 

编辑使用Python日志框架(根据Django docs)而不是stdout。

+0

即使点击服务器代码,它也会提供500内部服务器错误。我已经把上面的代码,但我只是得到[10/Feb/2012 16:00:00]“POST/people/add HTTP/1.1”500 57486在服务器上 – Neeran 2012-02-10 15:56:05

+0

我的演示代码发送回溯到标准输出,您的Django服务器可能没有捕获日志。尝试使用日志记录(编辑我的答案)。 – mattbornski 2012-02-10 16:03:54

+0

不,不管我把记录器放在服务器端脚本的什么地方,在显示500服务器错误之前它甚至都没有到达那里。 – Neeran 2012-02-10 16:11:11