Объект Flask, получающий ‘NoneType’, не подлежит подписке

#python #api #flask

#python #API #flask

Вопрос:

Я создаю API, который получает две данные, «id» и «name», но я получаю 'NoneType' object is not subscriptable" ошибку в name = request.json['Name']

 from flask import Flask, jsonify, request, Response #import flask library

from checking import checker


app = Flask(__name__)

@app.route("/v1/products", methods=["GET", "POST"])
def getData():
    user_id = request.json['id']
    name = request.json['Name']
    data = {'id' : user_id, 'Name' : name}
    flag =  checker(data)

    if flag == True:
        return 200, 'OK'
    else:
        return 403, 'Forbidden'

    


if __name__ == '__main__':
    app.run(host='localhost', debug=True)

  

Чтобы отправить данные для API, я запускаю следующий код:

 curl -X POST -H "Content-Type: v1/products" -d '{'id' : '123', 'Name' : 'mesa'}' http://localhost:5000/v1/products
  

Что я делаю не так?

Комментарии:

1. Что делает проверка (данных)? Возможно, вы захотите добавить flag = False что-нибудь перед вызовом этой функции. Убедитесь, что средство проверки (data) возвращает что-то и имеет оператор return в конце.

2. Попробуйте изменить заголовки типа содержимого на application/json .

3. Привет, Namandeep, спасибо за вашу помощь. Эта проверка (data) возвращает true или false, если пользователь уже существует. Проблема заключается в указании на ‘user_id = request.json[‘id’]’

Ответ №1:

Проблема не в вашем коде flask, а в вашем запросе curl. Вы неправильно задаете тип контента и тело, поэтому для обработки конечной точки вашего API нет json.

Вы захотите изменить первую часть вашей команды на: curl -X POST -H "Content-Type: application/json"

У вас также могут возникнуть проблемы с вашими кавычками в теле запроса, вам нужно либо экранировать, либо изменить кавычки, чтобы они не были двусмысленными.

Ответ №2:

Похоже, у меня это работает. Надеюсь, это сработает для вас:

 from flask import Flask, jsonify, request, Response #import flask library

app = Flask(__name__)


@app.route("/v1/products", methods=["GET", "POST"])
def getData():
    user_id = request.args['id']
    name = request.args['Name']
    data = {'id' : user_id, 'Name' : name}
    print(data)

    if request.args != None:
        print('OK')
    else:
        print('Forbidden')

    return (data)


if __name__ == '__main__':
    app.run(host='localhost', debug=True)