programing

Content-Type 헤더에 관계없이 Python Flask에서 원시 POST 본문 가져오기

powerit 2023. 7. 17. 21:28
반응형

Content-Type 헤더에 관계없이 Python Flask에서 원시 POST 본문 가져오기

이전에 플라스크 요청에서 데이터를 받는 방법을 문의한 적이 있습니다.request.data비어 있었습니다.그 대답은 설명했습니다.request.data는 원시 포스트 본문이지만 폼 데이터를 구문 분석하면 비어 있습니다.어떻게 하면 무조건 생우편물을 받을 수 있습니까?

@app.route('/', methods=['POST'])
def parse_request():
    data = request.data  # empty in some cases
    # always need raw data here, not parsed form data

내용 유형에 관계없이 원시 데이터를 가져오는 데 사용합니다.데이터가 캐시되고 나중에 액세스할 수 있습니다.request.data,request.json,request.form멋대로

액세스하는 경우request.data먼저, 그것은 부를 것입니다.get_data먼저 폼 데이터를 구문 분석하는 인수를 사용합니다.요청에 양식 내용 유형이 있는 경우(multipart/form-data,application/x-www-form-urlencoded또는application/x-url-encoded그러면 원시 데이터가 사용됩니다. request.data그리고.request.json이 경우 비어 있는 것으로 나타납니다.

request.stream WSGI 서버가 응용 프로그램에 전달하는 원시 데이터 스트림입니다.일반적으로 원하는 경우에도 읽을 때 구문 분석이 수행되지 않습니다.request.get_data()대신.

data = request.stream.read()

이전에 읽은 스트림은 비어 있습니다.request.data또는 다른 속성.

저는 WSGI 미들웨어를 만들었습니다. 이 미들웨어에는environ['wsgi.input']개울.WSGI 환경에서 액세스할 수 있도록 값을 저장했습니다.request.environ['body_copy']내 앱 내에서.

이것은 Werkzeug 또는 Flask에서 필요하지 않습니다.request.get_data()컨텐츠 유형에 관계없이 원시 데이터를 가져오지만 HTTP 및 WSGI 동작을 더 잘 처리합니다.

이렇게 하면 전체 본문이 메모리로 읽히는데, 이는 예를 들어 큰 파일이 게시된 경우 문제가 됩니다.만약 이것이 읽히지 않는다면 아무것도 읽지 않을 것입니다.Content-Length헤더가 누락되어 스트리밍 요청을 처리할 수 없습니다.

from io import BytesIO

class WSGICopyBody(object):
    def __init__(self, application):
        self.application = application

    def __call__(self, environ, start_response):
        length = int(environ.get('CONTENT_LENGTH') or 0)
        body = environ['wsgi.input'].read(length)
        environ['body_copy'] = body
        # replace the stream since it was exhausted by read()
        environ['wsgi.input'] = BytesIO(body)
        return self.application(environ, start_response)

app.wsgi_app = WSGICopyBody(app.wsgi_app)
request.environ['body_copy']

request.data다음과 같은 경우 비어 있습니다.request.headers["Content-Type"]양식 데이터로 인식되며, 이 데이터는 다음으로 구문 분석됩니다.request.form내용 유형에 관계없이 원시 데이터를 가져오려면 다음을 사용합니다.request.get_data().

request.data호출들request.get_data(parse_form_data=True)폼 데이터에 대한 다른 동작이 발생합니다.

언급URL : https://stackoverflow.com/questions/10999990/get-raw-post-body-in-python-flask-regardless-of-content-type-header

반응형