4

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を返すことは問題ではないようです

4

2 に答える 2

4

問題は、サーバーが POST 要求を許可していないことだと思います。代わりに GET リクエストで送信してみてください:

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

更新

あなたの質問をもう一度見て、実際に GET リクエストを介して JSON データを送信しようとしていることに気付きました。通常、GET リクエストで JSON を送信することは避けてください。代わりに POST リクエストを使用してください [参照]。

POST リクエストを Bottle に送信するには、ヘッダーを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"
于 2012-09-24T03:50:50.433 に答える
3

デフォルトでは、routeデコレータは装飾された関数にGETリクエストのみを処理させます。method代わりにPOSTリクエストを処理するようにBottleに指示する引数を追加する必要があります。そのためには、以下を変更する必要があります。

@app.route('/myroute/') 

に:

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

またはより短いバージョン:

@app.post('/myroute/')
于 2012-09-24T03:55:34.597 に答える