web-dev-qa-db-ja.com

POST bottle.pyの本文

POST bottle.pyを使用したリクエストの読み取りに問題があります。

送信されたリクエストの本文にはテキストが含まれています。 29行目でその方法を確認できます。 https://github.com/kinetica/tries-on.js/blob/master/lib/game.js

nodeベースのクライアントでの読み取り方法も、4行目で確認できます https://github.com/kinetica/tries-on.js/blob/master/masterClient.js

ただし、私はbottle.pyベースのクライアントでこの動作を模倣することができませんでした。 docs は、ファイルのようなオブジェクトで未加工の本文を読み取ることができると言いますが、request.bodyでforループを使用することも、request.bodyreadlinesメソッドを使用することもできません。

@route('/', method='POST')で修飾された関数でリクエストを処理していますが、リクエストは正しく到着します。

前もって感謝します。


編集:

完全なスクリプトは次のとおりです。

from bottle import route, run, request

@route('/', method='POST')
def index():
    for l in request.body:
        print l
    print request.body.readlines()

run(Host='localhost', port=8080, debug=True)
16
Martín Coll

シンプルなpostdata = request.body.read()を試しましたか?

次の例は、投稿されたデータをrequest.body.read()を使用してraw形式で読み取る方法を示しています。

また、ボディの生のコンテンツを(クライアントではなく)ログファイルに出力します。

フォームプロパティへのアクセスを示すために、クライアントに「名前」と「姓」を返すことを追加しました。

テストでは、コマンドラインからcurlクライアントを使用しました。

$ curl -X POST -F name=jan -F surname=vlcinsky http://localhost:8080

私のために働くコード:

from bottle import run, request, post

@post('/')
def index():
    postdata = request.body.read()
    print postdata #this goes to log file only, not to client
    name = request.forms.get("name")
    surname = request.forms.get("surname")
    return "Hi {name} {surname}".format(name=name, surname=surname)

run(Host='localhost', port=8080, debug=True)
18
Jan Vlcinsky

POSTされたデータを処理するための単純なスクリプト。 POSTされたデータは端末に書き込まれ、クライアントに返されます。

from bottle import get, post, run, request
import sys

@get('/api')
def hello():
    return "This is api page for processing POSTed messages"

@post('/api')
def api():
    print(request.body.getvalue().decode('utf-8'), file=sys.stdout)
    return request.body

run(Host='localhost', port=8080, debug=True)

上記のスクリプトにJSONデータをPOSTするためのスクリプト:

import requests
payload = "{\"name\":\"John\",\"age\":30,\"cars\":[ \"Ford\", \"BMW\",\"Fiat\"]}"
url = "localhost:8080/api"
headers = {
  'content-type': "application/json",
  'cache-control': "no-cache"
  }
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
3
Warf