รับข้อมูลที่ได้รับในคำขอขวด


736

ฉันต้องการรับข้อมูลที่ส่งไปยังแอพ Flask ของฉัน ฉันพยายามเข้าถึงrequest.dataแต่มันเป็นสตริงว่าง คุณเข้าถึงข้อมูลคำขอได้อย่างไร

from flask import request

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    data = request.data  # data is empty
    # need posted data here

คำตอบสำหรับคำถามนี้ทำให้ฉันถามGet POST body ดิบใน Python Flask โดยไม่คำนึงถึงส่วนหัว Content-Typeถัดไปซึ่งเกี่ยวข้องกับการรับข้อมูลดิบมากกว่าข้อมูลที่แยกวิเคราะห์

คำตอบ:


1265

เอกสารอธิบายคุณลักษณะที่มีอยู่ในการร้องขอ ในกรณีทั่วไปส่วนใหญ่request.dataจะว่างเปล่าเนื่องจากถูกใช้เป็นทางเลือก:

request.data มีข้อมูลคำขอเข้ามาเป็นสตริงในกรณีที่มาพร้อมกับ mimetype Flask ไม่ได้จัดการ

  • request.args: คู่คีย์ / ค่าในสตริงการสืบค้น URL
  • request.form: คู่ของคีย์ / ค่าในเนื้อหาจากแบบฟอร์มการโพสต์ HTML หรือคำขอ JavaScript ที่ไม่ได้เข้ารหัส JSON
  • request.files: ไฟล์ในร่างกายซึ่ง Flask แยกจากformกัน ต้องใช้ฟอร์ม HTML มิenctype=multipart/form-dataฉะนั้นไฟล์จะไม่ถูกอัปโหลด
  • request.values: รวมกันargsและformเลือกargsว่าจะให้คีย์ซ้อนทับกันหรือไม่
  • request.json: แยกวิเคราะห์ข้อมูล JSON คำขอต้องมีapplication/jsonประเภทเนื้อหาหรือใช้request.get_json(force=True)เพื่อละเว้นประเภทเนื้อหา

ทั้งหมดเหล่านี้เป็นMultiDictอินสแตนซ์ (ยกเว้นjson) คุณสามารถเข้าถึงค่าโดยใช้:

  • request.form['name']: ใช้การจัดทำดัชนีหากคุณรู้ว่ามีกุญแจอยู่
  • request.form.get('name'): ใช้getหากไม่มีคีย์อยู่
  • request.form.getlist('name'): ใช้getlistถ้าคีย์ถูกส่งหลายครั้งและคุณต้องการรายการค่า getส่งกลับค่าแรกเท่านั้น

204

request.dataเพื่อให้ได้ข้อมูลดิบที่ใช้ ใช้งานได้เฉพาะในกรณีที่ไม่สามารถแยกวิเคราะห์เป็นข้อมูลแบบฟอร์มมิฉะนั้นจะว่างเปล่าและrequest.formจะมีการแยกวิเคราะห์ข้อมูล

from flask import request
request.data

178

สำหรับพารามิเตอร์ URL request.argsสอบถามการใช้งาน

search = request.args.get("search")
page = request.args.get("page")

request.formสำหรับการป้อนข้อมูลที่โพสต์รูปแบบการใช้งาน

email = request.form.get('email')
password = request.form.get('password')

สำหรับการโพสต์ JSON กับชนิดของเนื้อหาapplication/json, request.get_json()การใช้งาน

data = request.get_json()

98

นี่คือตัวอย่างของการแยกวิเคราะห์ข้อมูล JSON และสะท้อนกลับ

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/foo', methods=['POST']) 
def foo():
    data = request.json
    return jsonify(data)

ในการโพสต์ JSON ด้วย curl:

curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo

หรือใช้บุรุษไปรษณีย์:

ใช้บุรุษไปรษณีย์เพื่อโพสต์ JSON


36

หากคุณโพสต์ JSON ด้วยประเภทเนื้อหาapplication/jsonใช้request.get_json()เพื่อรับมันใน Flask หากประเภทเนื้อหาไม่ถูกต้องNoneจะถูกส่งกลับ หากข้อมูลไม่ใช่ JSON ข้อผิดพลาดจะถูกยกขึ้น

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()

31

ที่จะได้รับการโพสต์ร่างกายดิบโดยไม่คำนึงถึงชนิดของเนื้อหา, request.get_data()การใช้งาน ถ้าคุณใช้request.dataมันเรียกrequest.get_data(parse_form_data=True)ซึ่งจะเติมrequest.form MultiDictและปล่อยให้dataว่างเปล่า


18

ที่จะได้รับเป็นพจนานุกรมภาษาปกติการใช้งานrequest.formrequest.form.to_dict(flat=False)

หากต้องการกลับ JSON ข้อมูลสำหรับ API, jsonifyผ่านไป

ตัวอย่างนี้ส่งคืนข้อมูลแบบฟอร์มเป็นข้อมูล JSON

@app.route('/form_to_json', methods=['POST'])
def form_to_json():
    data = request.form.to_dict(flat=False)
    return jsonify(data)

นี่คือตัวอย่างของข้อมูลแบบฟอร์ม POST ที่มี curl ซึ่งส่งคืนเป็น JSON

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}

12

ใช้request.get_json()เพื่อรับข้อมูล JSON ที่โพสต์

data = request.get_json()
name = data.get('name', '')

ใช้request.formเพื่อรับข้อมูลเมื่อส่งแบบฟอร์มด้วยวิธีการ POST

name = request.form.get('name', '')

ใช้request.argsเพื่อรับข้อมูลที่ส่งผ่านในสตริงเคียวรีของ URL เช่นเมื่อส่งแบบฟอร์มด้วยเมธอด GET

request.args.get("name", "")

request.formฯลฯ เป็นเหมือน dict ใช้getวิธีการรับค่าเป็นค่าเริ่มต้นหากไม่ผ่าน


10

ที่จะได้รับ JSON โพสต์โดยไม่ต้องapplication/jsonชนิดของเนื้อหา, request.get_json(force=True)การใช้งาน

@app.route('/process_data', methods=['POST'])
def process_data():
    req_data = request.get_json(force=True)
    language = req_data['language']
    return 'The language value is: {}'.format(language)

10

ข้อมูลดิบจะถูกส่งไปยังแอพพลิเคชั่น Flask จากเซิร์ฟเวอร์ WSGI request.streamดังนี้ ความยาวของกระแสข้อมูลอยู่ในContent-Lengthส่วนหัว

length = request.headers["Content-Length"]
data = request.stream.read(length)

มันปลอดภัยกว่าที่จะใช้request.get_data()แทน


9

เพื่อโพสต์ JSON กับ jQuery ใน JavaScript ใช้เพื่อการถ่ายโอนข้อมูลและการตั้งค่าชนิดเนื้อหาJSON.stringifyapplication/json

var value_data = [1, 2, 3, 4];

$.ajax({
    type: 'POST',
    url: '/process',
    data: JSON.stringify(value_data),
    contentType: 'application/json',
    success: function (response_data) {
        alert("success");
    }   
});

request.get_json()แยกไว้ในขวดด้วย

data = request.get_json()

8

ที่จะแยก JSON request.get_json()ใช้

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(request.get_json())
    return jsonify(data=result)

5

นี่คือตัวอย่างของการโพสต์ข้อมูลแบบฟอร์มเพื่อเพิ่มผู้ใช้ไปยังฐานข้อมูล ตรวจสอบrequest.method == "POST"เพื่อตรวจสอบว่ามีการส่งแบบฟอร์มหรือไม่ ใช้ปุ่มจากrequest.formเพื่อรับข้อมูลในแบบฟอร์ม แสดงเท็มเพลต HTML ด้วย<form>มิฉะนั้น เขตข้อมูลในรูปแบบควรจะมีคุณลักษณะที่ตรงกับคีย์ในnamerequest.form

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route("/user/add", methods=["GET", "POST"])
def add_user():
    if request.method == "POST":
        user = User(
            username=request.form["username"],
            email=request.form["email"],
        )
        db.session.add(user)
        db.session.commit()
        return redirect(url_for("index"))

    return render_template("add_user.html")
<form method="post">
    <label for="username">Username</label>
    <input type="text" name="username" id="username">
    <label for="email">Email</label>
    <input type="email" name="email" id="email">
    <input type="submit">
</form>

4

หากประเภทเนื้อหาได้รับการยอมรับว่าเป็นข้อมูลในรูปแบบrequest.dataจะแยกวิเคราะห์ว่าเป็นrequest.formและส่งกลับสตริงที่ว่างเปล่า

request.get_data()เพื่อให้ได้ข้อมูลดิบโดยไม่คำนึงถึงชนิดของเนื้อหาโทร request.dataโทรget_data(parse_form_data=True)ในขณะที่เริ่มต้นคือFalseถ้าคุณเรียกมันโดยตรง


4

หากร่างกายได้รับการยอมรับว่าเป็นข้อมูลในแบบฟอร์มก็จะเข้าrequest.formมา ถ้าเป็น JSON มันจะอยู่ในrequest.get_json()นั้น request.dataมิฉะนั้นข้อมูลดิบจะอยู่ใน หากคุณไม่แน่ใจว่าจะส่งข้อมูลอย่างไรคุณสามารถใช้orเครือข่ายเพื่อรับข้อมูลแรก

def get_request_data():
    return (
        request.args
        or request.form
        or request.get_json(force=True, silent=True)
        or request.data
    )

request.argsมี args แยกวิเคราะห์จากสตริงการสืบค้นโดยไม่คำนึงถึงสิ่งที่อยู่ในเนื้อหาดังนั้นคุณจะลบมันออกจากget_request_data()ทั้งสองถ้ามันและเนื้อหาควรข้อมูลในเวลาเดียวกัน


2

เมื่อโพสต์ข้อมูลในแบบฟอร์มที่มีรูปแบบ HTML ที่จะแน่ใจว่าinputแท็กมีแอตทริบิวต์มิฉะนั้นพวกเขาจะไม่อยู่ในปัจจุบันnamerequest.form

@app.route('/', methods=['GET', 'POST'])
def index():
    print(request.form)
    return """
<form method="post">
    <input type="text">
    <input type="text" id="txt2">
    <input type="text" name="txt3" id="txt3">  
    <input type="submit">
</form>
"""
ImmutableMultiDict([('txt3', 'text 3')])

เพียงtxt3ป้อนข้อมูลมีดังนั้นจึงเป็นเรื่องที่สำคัญในปัจจุบันเฉพาะในnamerequest.form

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.