Отправка ответа JSON в маршруте Flask "POST" - PullRequest
1 голос
/ 19 июня 2020

Для справки я рассмотрел эти три вопроса:

Возврат JSON ответ от Flask просмотр

Отправка JSON и код состояния с ответом Flask

Вернуть объект requests.Response из Flask

Как указано в заголовке, я пытаюсь вернуть JSON ответ от метода flask post. Маршрут flask выглядит следующим образом:

@app.route('/login', methods=['POST'])
def login_route():
    content = request.json
    jwt = get_authorization(content['username'], content['password'])
    return {'session-token': jwt} , 200

Где в моем веб-приложении я хотел бы сохранить session-token в файлах cookie (на данный момент).

В настоящее время на веб-стороне у меня есть следующий код:

static postWithJSONResponse(url, body, onFetchComplete, onFetchFailure) {
        fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(body)
        })
        .then((data) => onFetchComplete(data))
        .catch(error => onFetchFailure(error));
    }
componentDidMount() {
        NetworkUtils.postWithJSONResponse('/login', this.state.userObject,
        (data) => {
             console.log(data);
        },
        (error) => {

        });
    }

Где userObject состоит из атрибутов username и password. Я пробовал несколько вариантов моего маршрута flask, учитывая предыдущие поисковые запросы, перечисленные выше:

Варианты на основе этого вопроса

from flask import jsonify

@app.route('/login', post)
def login_route():
    content = request.json
    d = {}
    d['session-token'] = get_authorization(content['username'], content['password'])
    return jsonify(d)

Этот вариант из тот же пост:

@app.route('/login', post)
def login_route():
    content = request.json
    jwt = get_authorization(content['username'], content['password'])
    app.response_class(
        response=json.dumps({'session-token': jwt}),
        status=200,
        mimetype='application/json'
    )

И, наконец, эта попытка, в которой было рекомендовано попробовать создать новый объект ответа :

from flask import Flask, request, make_response

@app.route('/login', methods=['POST'])
def login_route():
    content = request.json
    jwt = get_authorization(content['username'], content['password'])
    resp = make_response(json.dumps({'session-token': jwt}), 200)
    resp.headers['Content-Type'] = 'application/json'
    return resp

Все 3 попытки возвращаются следующие объекты ответа json на мою chrome консоль:

Response {type: "basic", url: "http://localhost:3000/login", redirected: false, status: 200, ok: true, …}
body: ReadableStream
locked: false
__proto__: ReadableStream
bodyUsed: false
headers: Headers
__proto__: Headers
ok: true
redirected: false
status: 200
statusText: "OK"
type: "basic"
url: "http://localhost:3000/login"
__proto__: Response

Как видите, объект ответа не содержит ни одной записи для session-token. Я действительно не уверен, что здесь может быть не так, и я не уверен, связана ли проблема с маршрутом flask или javascript. Излишне говорить, что мне нужна помощь, и любые рекомендации будут оценены. Я использую Flask версию 1.1.2.

1 Ответ

2 голосов
/ 19 июня 2020

API fetch в Javascript хорош в том смысле, что он дает вам варианты, которые вы видите, когда регистрируете его, например, потенциальный доступ к телу как потоку (теперь в любой день T C 39 ...) , но он полностью перестроен для случая 90%. Заклинание магов c, которое следует запомнить, выглядит следующим образом:

Новомодный причудливый Javascript

// can only do this inside an async function
const resp = await fetch(someURL);
const jsonData = await resp.json();
// step 3, profit

(Очень немного) Старая (э) школа Javascript

fetch(someURL)
  .then(resp => resp.json())
  .then(jsonData => /* profit! */);

Функционально эквивалентны. Используйте более новую, если вы всегда хотели сесть за школьный стол за классным ребенком. Используйте другой, если вы такой же скучный скряга, как я, который в наши дни жалуется на детей с их крутыми столиками и обедами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...