簡體   English   中英

Flask - 當內容類型為“application/x-www-form-urlencoded”時,如何在 POST 請求中讀取原始正文

[英]Flask - How do I read the raw body in a POST request when the content type is "application/x-www-form-urlencoded"

如果請求的內容類型是application/x-www-form-urlencoded ,Flask 會將request.data設置為空字符串。 由於我使用的是 JSON 正文請求,我只想解析 json 或強制 Flask 解析它並返回request.json

這是必需的,因為更改 AJAX 內容類型會強制執行 HTTP OPTION 請求,這會使后端復雜化。

如何讓 Flask 返回請求對象中的原始數據?

如果內容類型是application/x-www-form-urlencoded ,您可以通過request.form.keys()[0]獲取帖子數據。

request.form是一個multidict ,其鍵包含已解析的發布數據。

使用request.get_data()獲取 POST 數據。 這與數據是否具有內容類型application/x-www-form-urlencodedapplication/octet-stream無關。

如果您想在請求為 'Content-Type': 'application/x-www-form-urlencoded' 時獲取 JSON,則需要“強制”轉換為 json,如下面的代碼:

from flask import Flask, request
import os


app = Flask(__name__)


@app.route("/my-endpoint", methods = ['POST'])
def myEndpoint():

    requestJson = request.get_json(force=True)

    //TODO: do something....

    return requestJson


if __name__ == "__main__":
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port, debug=True, use_reloader=True)

嘗試這個:

f = request.form

   output = []

   user_data = {}

   user_data['email'] = f['email']

   user_data['password'] = f['password']

   user_data['key'] = f['key']

   output.append(user_data)

主文件

import json

from flask import Flask, request

app = Flask(__name__)


@app.route('/', methods=['POST'])
def index():
    mimetype = request.mimetype
    if mimetype == 'application/x-www-form-urlencoded':
        form = json.loads(next(iter(request.form.keys())))
    elif mimetype == 'multipart/form-data':
        form = dict(request.form)
    elif mimetype == 'application/json':
        form = request.json
    else:
        form = request.data.decode()
    print(mimetype, form, type(form))
    return form


if __name__ == '__main__':
    app.run()

測試

curl -X POST http://127.0.0.1:5000/ --data "{\"a\":1, \"b\":2}"

curl -X POST http://127.0.0.1:5000/ -F a=1 -F b=2

curl -X POST -H "Content-type: application/json" http://127.0.0.1:5000/ --data "{\"a\":1, \"b\":2}"

結果

application/x-www-form-urlencoded {'a': 1, 'b': 2} <class 'dict'>
multipart/form-data {'a': '1', 'b': '2'} <class 'dict'>
application/json {'a': 1, 'b': 2} <class 'dict'>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM