flask的post,get請求及獲取不同格式的參數


flask的post,get請求及獲取不同格式的參數

1 獲取不同格式參數

 

 

 

1.0 獲取json參數

  • Demo
from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/jsonargs/<string:args_1>', methods=['POST'])
def json_args(args_1):
    args_2 = request.json.get("args_2")
    args_3 = request.json['args_3']
    return jsonify({"args_1":args_1, "args_2":args_2, "args_3":args_3})

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080, debug=True)
  • request

 

 

 

1.2 獲取form參數

  • Demo
from flask import Flask, request, jsonify

app = Flask(__name__)
@app.route('/formargs/<int:args_1>', methods=['POST'])
def form_args(args_1):
    args_2 = request.form.get('args_2')
    args_3 = request.form['args_3']
    return jsonify({"args_1":args_1, "args_2":args_2, "args_3":args_3})

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080, debug=True)
  • request

 

 

 

1.3 get獲取地址欄參數

from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/getargs', methods=['GET', 'POST'])
def get_args():
    args_1 = request.args.get("args_1")
    args_2 = request.args.get("args_2")
    args_3 = request.args.get("args_3")
    return jsonify({"args_1":args_1, "args_2":args_2, "args_3":args_3})
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080, debug=True)

Request

 

 

 

1.4 獲取file文件

from flask import Flask, request, jsonify
import os
basedir = os.path.abspath(os.path.dirname(__name__))
app = Flask(__name__)

@app.route('/imageprocess', methods=['GET', 'POST'])
def image_preprocess():
    # get upload image and save
    image = request.files['image']
    path = basedir + "/source_images/"
    file_path = path + image.filename
    image.save(file_path)
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080, debug=True)

1.5 獲取任何格式

from flask import Flask, request

app = Flask(__name__)

def upload_data():
    data = request.values.get("input")
    return jsonify({"data type":"successfully upload!"})
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8090, debug=True)

2 文件格式解析

from flask import Flask, jsonify, request,abort
import os

app = Flask(__name__)
def path_get():
    path = os.path.abspath(os.path.dirname(__name__))
    return path

@app.route('/connect', methods=["GET"])
def connect():
    return jsonify({"connect state":"successfully connect!"})

@app.route('/upload_data', methods=["GET", "POST"])
def upload_data():
    # 判斷form文件是否為空及是否是form文件
    if request.form and 'input' in request.form:
        upload_data = request.form['input']
        form_type = request.form
        print("form type: {}".format(form_type))
        # return jsonify({"input data":upload_data})
        return jsonify({"form data type":form_type})
    # 判斷json文件是否為空及是否是json文件
    elif request.json and 'input' in request.json:
        upload_data = request.json['input']
        # return jsonify({"input data":upload_data})
        # return jsonify({"input test":"success"})
        json_type = request.json
        print("json type: {}".format(json_type))
        return jsonify({"form data type":json_type})
    # 判斷files文件是否為空及是否是files文件
    elif 'input' in request.files:
        file = request.files["input"]
        path = path_get() + "/images/test.png"
        # file.save(path)
        files_type = request.files
        print("files type: {}".format(files_type))
        return jsonify({"path":path})
        
        # return jsonify({"form data type":files_type})

    else:
        abort(400)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8098, debug=True)

Result

# form數據
form type: ImmutableMultiDict([('input', 'dancer')])
{
    "form data type": {
        "input": "dancer"
    }
}
=======================
# json數據
json type: {'input': 'jumper'}
{
    "form data type": {
        "input": "jumper"
    }
}
=======================
# files文件
files type: ImmutableMultiDict([('input', <FileStorage: '1.jpeg' ('image/jpeg')>)])

Analysis
(1) form數據是可遍歷的字典,可使用字典屬性;
(2) json數據為字典,可使用字典屬性;
(3) files數據為可遍歷的字典,可使用字典屬性,通過key判斷是否存在該key,如input這個鍵;
(4) 當使用數據中的一種格式時,其他的數據為None,不可遍歷,因此直接使用if判斷是否為該類型的數據,會拋出錯誤TypeError: argument of type 'NoneType' is not iterable,所以通過先判斷數據是否為空,然后判斷是否為指定格式,解除錯誤;

3 獲取checkbox數據

3.1 獲取一個checkbox數據

  • html
<p><input type="checkbox" name="checkbox_name" value="選擇框">選擇框</p>
  • flask
data = request.values.get("checkbox_name")

3.2 獲取多個checkbox數據

  • html
<p><input type="checkbox" name="checkbox_names" value="選擇1">選擇1</p>
<p><input type="checkbox" name="checkbox_names" value="選擇1">選擇2</p>
<p><input type="checkbox" name="checkbox_names" value="選擇1">選擇3</p>
  • flask
datas = request.values.getlist("checkbox_names")

3.3 分級選擇

參考:https://www.cnblogs.com/kaituorensheng/p/4529113.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 


<script>
function allSelect(check_v, checkname)
{
    var v_item = document.getElementsByName(check_v);
    var items = document.getElementsByName(checkname);
    for (var i = 0; i < items.length; ++i)
    {
        if (v_item[0].checked)
        {
            items[i].checked = true;
        }
        else
        {
            items[i].checked = false;
        }
    }
}

function singleSelect2parent(check_v, checkname)
{
    var v_item = document.getElementsByName(check_v);
    var items = document.getElementsByName(checkname);
    var childStatus = true;
    for (var i = 0; i < items.length; ++i)
    {
        childStatus = (childStatus && items[i].checked);
    }
    if (childStatus)
    {
        v_item[0].checked = true;
    }
    else
    {
        v_item[0].checked = false;
    }
}

</script>
</head>
<body>

<p> <input type="checkbox" checked name="checkbox_v1" value="version1" onclick="allSelect('checkbox_v1', 'checkbox1')">默認全選</p>
<ul>
    <p> <input type="checkbox" checked name="checkbox1" value="layer1" onclick="singleSelect2parent('checkbox_v1', 'checkbox1')">tiger_roads</p>
    <p> <input type="checkbox" checked name="checkbox1" value="layer2" onclick="singleSelect2parent('checkbox_v1', 'checkbox1')">poly_landmarks</p>
    <p> <input type="checkbox" checked name="checkbox1" value="layer3" onclick="singleSelect2parent('checkbox_v1', 'checkbox1')">poi</p>
</ul>

<p> <input type="checkbox" name="checkbox_v2" value="version2" onclick="allSelect('checkbox_v2', 'checkbox2')">默認全不選</p>
<ul>
    <p> <input type="checkbox" name="checkbox2" value="layer1" onclick="singleSelect2parent('checkbox_v2', 'checkbox2')" >tiger_roads</p>
    <p> <input type="checkbox" name="checkbox2" value="layer2" onclick="singleSelect2parent('checkbox_v2', 'checkbox2')">poly_landmarks</p>
    <p> <input type="checkbox" name="checkbox2" value="layer3" onclick="singleSelect2parent('checkbox_v2', 'checkbox2')">poi</p>
</ul>
</body>

</html>

4 總結
(1) 數據獲取使用request請求,常用數據格式有json,form,file及地址欄的get請求數據;
(2) form及json數據請求方式均有兩種,如request.json.get(),request.json[];
(3) 獲取文件數據,可通過filename屬性獲取文件名,save屬性進行保存;
(4) 地址欄可直接寫入數據,需在route的方法內使用格式為:<type:args>如<int:id>,<string:name>等;
(5) 通過判斷輸入數據的格式,提供不同類型的輸入;

[參考文獻]
[1]https://www.jianshu.com/p/ecd97b1c21c1
[2]https://blog.csdn.net/p571912102/article/details/80526634
[3]https://www.cnblogs.com/kaituorensheng/p/4529113.html
[4]https://blog.csdn.net/kuangshp128/article/details/68926902

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM