瓶子request.json在帖子上得到405

时间:2012-09-24 03:24:59

标签: python json xmlhttprequest bottle http-status-code-405

我正试图让瓶子在xmlhttprequest中接收json并且我收到405错误

我的瓶子脚本的一部分:

@app.route('/myroute/')
def myroute():
    print request.json

我测试xhr的其他脚本的一部分:

jdata = json.dumps({"foo":"bar"})
urllib2.urlopen("http://location/app/myroute/", jdata)

为什么我会得到405?

bottlepy error: 127.0.0.1 - - [2012-09-23 23:09:34] "POST /myroute/ HTTP/1.0" 405 911 0.005458

urllib2 error: urllib2.HTTPError: HTTP Error 405: Method Not Allowed

我也试过以下的变体:

@app.route('/myroute/json:json#[1-9]+#')
def myroute(json):
    request.content_type = 'application/json'
    print request.json, json

返回json似乎不是问题

2 个答案:

答案 0 :(得分:4)

我认为问题是服务器不允许POST请求。您可以尝试在GET请求中尝试发送它:

urllib2.urlopen("http://location/app/myroute/?" + jdata)

更新

我刚刚在再次查看您的问题后意识到您实际上是在尝试通过GET请求发送JSON数据。您通常应该避免使用GET请求发送JSON,而是使用POST请求[Reference]。

要向Bottle发送POST请求,您还需要set the headers to application/json

headers = {}
headers['Content-Type'] = 'application/json'
jdata = json.dumps({"foo":"bar"})
urllib2.urlopen("http://location/app/myroute/", jdata, headers)

然后,在@Anton的回答的帮助下,您可以在视图中访问JSON数据,如下所示:

@app.post('/myroute/')
def myroute():
    print request.json

另外,作为奖励,发送正常的GET请求并访问它:

# send GET request
urllib2.urlopen("http://location/app/myroute/?myvar=" + "test")

# access it 
@app.route('/myroute/')
def myroute():
    print request.GET['myvar'] # should print "test"

答案 1 :(得分:3)

默认情况下,route装饰器使装饰函数仅处理GET请求。您需要添加method参数来告诉Bottle处理POST请求。为此,您需要更改:

@app.route('/myroute/') 

为:

@app.route('/myroute/', method='POST')

或更短的版本:

@app.post('/myroute/')