我正试图让瓶子在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似乎不是问题
答案 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/')