플라스크 요청에서 수신 한 데이터 가져 오기


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

이 질문에 대한 답변으로 Content-Type 헤더에 관계없이 Python Flask에서 원시 POST 본문 가져 오기를 요청했습니다. 이는 구문 분석 된 데이터가 아닌 원시 데이터를 얻는 것입니다.

답변:


1265

문서는 요청에 속성을 사용할 수 설명합니다. 대부분의 경우 request.data폴백으로 사용되므로 비어 있습니다.

request.data Flask가 처리하지 못하는 mimetype과 함께 제공된 경우 수신 요청 데이터를 문자열로 포함합니다.

  • request.args: URL 쿼리 문자열의 키 / 값 쌍
  • request.form: 본문에서 HTML 게시물 양식 또는 JSON으로 인코딩되지 않은 JavaScript 요청의 키 / 값 쌍
  • request.files: Flask와 구분되는 본문의 파일 form. HTML 양식을 사용해야 enctype=multipart/form-data하거나 파일이 업로드되지 않습니다.
  • request.values: 결합 argsform, 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)

curl로 JSON을 게시하려면 :

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()플라스크에 그것을 얻을 수 있습니다. 내용 유형이 올바르지 않으면 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.form일반 사전으로 가져 오려면 을 사용하십시오 request.form.to_dict(flat=False).

API에 대한 JSON 데이터를 반환하려면 jsonify .

이 예에서는 양식 데이터를 JSON 데이터로 반환합니다.

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

다음은 curl로 POST 형식 데이터를 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.formPOST 메소드로 양식을 제출할 때 데이터를 얻는 데 사용하십시오 .

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

request.argsGET 메소드를 사용하여 양식을 제출할 때와 같이 URL의 쿼리 문자열에 데이터를 전달하는 데 사용하십시오 .

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

request.form등등은 dict와 유사합니다.이 get방법을 사용하여 값이 전달되지 않은 경우 기본값을 사용하십시오.


10

application/json콘텐츠 형식 없이 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

원시 데이터는 WSGI 서버에서 Flask 애플리케이션으로로 전달됩니다 request.stream. 스트림의 길이는 Content-Length헤더에 있습니다.

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

request.get_data()대신 사용 하는 것이 일반적으로 더 안전합니다 .


9

JavaScript에서 jQuery와 함께 JSON을 게시하려면을 사용 JSON.stringify하여 데이터를 덤프하고 컨텐츠 유형을로 설정하십시오 application/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하여 양식 데이터를 가져옵니다. <form>그렇지 않으면 HTML 템플릿을 렌더링하십시오 . 양식의 필드에는 name의 키와 일치하는 속성 이 있어야 합니다 request.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.datarequest.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본문에있는 내용에 관계없이 쿼리 문자열에서 구문 분석 된 인수를 포함하므로 get_request_data()본문과 본문 모두 동시에 데이터를 가져야하는 경우이를 제거합니다 .


2

HTML 양식으로 양식 데이터를 게시 할 때 input태그에 name속성 이 있는지 확인하십시오. 그렇지 않으면에 표시되지 않습니다 request.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입력 에만을 가졌 name으므로에 유일한 키가 있습니다 request.form.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.