programing

Flask, ajax 호출 성공 상태 코드를 반환하는 방법

bestprogram 2023. 3. 28. 22:45

Flask, ajax 호출 성공 상태 코드를 반환하는 방법

서버측에서는 json-as-dictionary를 콘솔에 출력하고 있습니다.

@app.route('/',methods=['GET','POST'])
@login_required
def index():
    if request.method == "POST":
        print request.json.keys()
    return "hello world"

이제 Ajax를 통해 포스트 요청을 할 때마다 콘솔이 필요한 내용을 포함한 사전을 출력합니다.

클라이언트 측에서는 다양한 메서드를 사용하여 성공한Ajax 콜을 기반으로 jquery를 실행하려고 합니다.이것이 서버측의 에러일 가능성이 있는 것을 깨달았습니다.즉, jquery에게 요청 헤더를 송신하지 않고, 그 ajax 콜이 성공했음을 알립니다.

그럼 어떻게 하면 고객에게 OK 상태를 돌려보내 모든 것이 정상임을 알릴 수 있을까요?

완성도를 높이기 위해 고객측 코드입니다.

$.ajax({
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(myData),
    dataType: 'json',
    url: '/',
    success: function () {
        console.log("This is never getting printed!!")
    }});

플라스크의 응답에 대해서:

응답에 대해서

뷰 함수의 반환 값은 자동으로 응답 개체로 변환됩니다.반환값이 문자열인 경우 문자열이 응답 본문인 응답 개체로 변환됩니다.200 OK상태 코드 및 atext/htmlmimtype을 선택합니다.Flask가 return 값을 response object로 변환할 때 적용하는 논리는 다음과 같습니다.

  1. 올바른 유형의 응답 개체가 반환되면 보기에서 직접 반환됩니다.
  2. 문자열인 경우 해당 데이터와 기본 매개 변수를 사용하여 응답 개체가 생성됩니다.
  3. 태플이 반환된 경우 태플 내의 항목을 통해 추가 정보를 제공할 수 있습니다.이러한 튜플은 다음 형식이어야 합니다.(response, status, headers)또는(response, headers)적어도 하나의 항목이 태플에 있어야 합니다.statusvalue가 상태 코드를 덮어쓰고headers는 추가 헤더 값의 목록 또는 사전일 수 있습니다.
  4. 이 중 하나라도 작동하지 않으면 Flask는 반환값이 유효한 WSGI 응용 프로그램이라고 가정하고 응답 개체로 변환합니다.

따라서 텍스트 문자열을 반환할 경우(실행 중), AJAX 콜이 수신해야 하는 상태 코드는 다음과 같습니다.200 OK성공 콜백이 실행 중이어야 합니다.단, 다음과 같은 JSON 형식의 응답을 반환할 것을 권장합니다.

return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 

aabilio의 답변 옵션으로서 Plask의 jsonify 메서드를 사용하여 Content-Type을 자동으로 설정할 수 있습니다.

from flask import jsonify

resp = jsonify(success=True)
return resp

응답 코드를 명시적으로 설정할 수 있습니다(옵션).

resp.status_code = 200

이미 게시된 답변 외에, 특히 플라스크에서 JSON for APIs에 대한 응답으로 상태 코드를 반환해야 할 경우 플라스크의 메서드(0.6 버전부터)를 사용하는 것이 보다 명확한 대안이 될 수 있습니다.

from flask import Flask, jsonify, make_response

app = Flask(__name__)


@app.route('/do_thing')
def do_thing():
    # ... other code ...
    data = {'message': 'Done', 'code': 'SUCCESS'}
    return make_response(jsonify(data), 201)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

이 에서는, 코드(201수으로 「」, 「」, 「」(201), 「」, 「」, 「」가 설정됩니다.Content-Type header header header header header header 。application/json.

플라스크의 새로운 버전에서는 응답으로 변환을 처리합니다.다음과 같이 사전 및 응답 코드를 반환하도록 응답을 단순화할 수 있습니다.

@app.route("/my_route")
def my_route():
    data = {"status": "success", "some key", "some value"}
    return data, 200

data사전일 필요는 없습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★!

다음을 사용하여 응답을 반환할 때jsonify추가만 하면 됩니다.status_code의 두 return사용한 적이 있습니다.jsonifyadmin_required decorator 40 401 무 httpHTTP 。§:

return jsonify({'error': 'Admin access is required'}), 401

완전한 예:

def admin_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if current_user and hasattr(current_user, 'user_type') and current_user.user_type == 'admin':
            return f(*args, **kwargs)
        else:
            if '/api/' in request.url_rule.rule:
                return jsonify({'error': 'Admin access is required'}), 401

            flash(_('Admin access required'))
            return redirect(url_for('main.public_index'))

    return decorated

response_class를 json 덤프와 함께 사용할 수도 있습니다.다음의 예를 확인해 주세요.

from flask import Flask
from flask import json

app = Flask(__name__)

@app.route(/info)
def getInfo():
    response = app.response_class(
            response=json.dumps({"status":"success","code":0,"data":{"Name":"Eyong","Age":30}}),
            status=200,
            mimetype='application/json'
    )
    return response

언급URL : https://stackoverflow.com/questions/26079754/flask-how-to-return-a-success-status-code-for-ajax-call