Колба - Какая разница при возврате jsonify против dict? - PullRequest
3 голосов
/ 04 ноября 2019

У меня есть маршрут, который возвращает ответ пользователю на запрос POST. Я возвращаю dict по запросу. Проблема в том, что в некоторых случаях возврат dict работает нормально, но иногда выдает ошибку.

Может кто-нибудь объяснить, какой идеальный тип возврата и почему возврат dict успешен в некоторых случаях?

@app.route('/getuser', methods = ['post'] )
def getusername():
    user = request.json.get("user_name")

    # This works good for few cases
    return {"username": user}

    # Whereas other require this
    return jsonify({"username": user})

1 Ответ

1 голос
/ 06 ноября 2019

TLDR : Разницы нет.


Базовый пример:

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/getuser_dict', methods=['POST'])
def getuser_dict():
    user = request.json.get("user_name")
    return {"username": user}


@app.route('/getuser_jsonify', methods=['POST'])
def getuser_jsonify():
    user = request.json.get("user_name")
    return jsonify({"username": user})


if __name__ == '__main__':
    app.run()

Запрос и ответ на оба вопроса /getuser_dict и /getuser_jsonify одинаковы ( нерелевантные части не указаны ):

> POST /getuser_dict HTTP/1.1
> Host: 127.0.0.1:5000
> User-Agent: insomnia/7.0.3
> Content-Type: application/json
> Accept: */*
> Content-Length: 24

| {
|   "user_name": "John"
| }

* upload completely sent off: 24 out of 24 bytes
* HTTP 1.0, assume close after body

< HTTP/1.0 200 OK
< Content-Type: application/json
< Content-Length: 20
< Server: Werkzeug/0.16.0 Python/3.6.8
< Date: Wed, 06 Nov 2019 09:34:51 GMT


* Received 20 B chunk
* Closing connection 65

Возвращение dict только внутренне проверяет, какой тип объекта вы возвращаете, это string,tuple, BaseResponse или dict. Когда он определяет, что вы действительно возвращаете dict с помощью isinstance(rv, dict), он вызывает jsonify(rv) для вашего dict объекта и возвращает.

Пожалуйста, взгляните на make_response метод app.py. Часть, в которой он проверяет, является ли это объектом dict , также находится там.

...