瓶子 request.json 在帖子中获得 405

Posted

技术标签:

【中文标题】瓶子 request.json 在帖子中获得 405【英文标题】:bottle request.json getting a 405 on post 【发布时间】:2012-09-15 12:36:14 【问题描述】:

我正在尝试让瓶子在 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 似乎不是问题

【问题讨论】:

【参考方案1】:

我认为问题在于服务器不允许 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"

【讨论】:

感谢您的帮助,这两个答案都是正确的!我仍然无法让 request.json 显示任何内容,但至少服务器没有出现故障。 @scape 我已经更新了我的答案,希望它能回答你的问题 :) 是的,我也意识到我需要在 urllib2 中设置标题,所以我按照您的建议进行了发布并添加了标题。感谢您的跟进!【参考方案2】:

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

@app.route('/myroute/') 

到:

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

或更短的版本:

@app.post('/myroute/')

【讨论】:

以上是关于瓶子 request.json 在帖子中获得 405的主要内容,如果未能解决你的问题,请参考以下文章

带瓶子的蟒蛇网

带瓶子和会话的python web(烧杯)

Grails 命令对象:如何将 request.JSON 加载到其中?

robotframework接口测试—Get request json

如何对两个 SUMmed SQL 结果字段求和

php 在wordpress中获得帖子的标题