Ошибка Flask: ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘get’

#python #rest #flask #flask-restful #flask-login

#python #rest #flask #flask-restful #flask-login

Вопрос:

Я использую Flask для разработки restful API. Я пишу примеры pytest для проверки пути / api / users. Во время тестирования я получаю ошибку ниже. Я использую SQL Alchemy. Я относительно новичок в Flask. Любая помощь будет высоко оценена

Flask API:

 @app.route('/api/users', methods=['POST'])
def new_user():
    username = request.json.get('username')
    password = request.json.get('password')
    user = User(username = username)
    user.hash_password(password)
    db.session.add(user)
    db.session.commit()
    return ("user")
  

Случай Pytest:

 @pytest.fixture
def client():
    db_fd, app.config['DATABASE'] = tempfile.mkstemp()
    app.config['TESTING'] = True
    client = app.test_client()

    yield client

    os.close(db_fd)
    os.unlink(app.config['DATABASE'])

@pytest.fixture
def user():
    return {
    'username': 'test_username',
    'password': 'test_password',
    'email': 'test_email'
    }



def _new_user(client, user):
    return client.post('/api/users', json.dumps(user))


# REGISTER USER
def test_new_user(client, user):
    res = _new_user(client, user)

    assert res.status_code == 201
    assert 'user' in json.loads(res.get_data())

  

Когда я запускаю тестовый пример, я получаю ошибку ниже

     @app.route('/api/users', methods=['POST'])
    def new_user():
>       username = request.json.get('username')
E       AttributeError: 'NoneType' object has no attribute 'get'

apa/routes.py:20: AttributeError
  

Ответ №1:

Проблема в том, как вы отправляете json. Вам нужно изменить эту строку:

 def _new_user(client, user):
    return client.post('/api/users', json.dumps(user))
  

чтобы быть:

 def _new_user(client, user):
    return client.post('/api/users', json=json.dumps(user))
  

Если вы не укажете json в качестве аргумента, он будет помещен в request.data атрибут, а не request.json.

В общем, если вы пытаетесь получить ключи из json, отправленного в API, это хорошая идея для завершения try / except, поскольку вы получите ошибку server 500, если ключ не существует или json не был отправлен. С помощью веб-API желательно иметь возможность возвращать ответ клиенту, даже если сообщение было искажено, что помогает с более сложными API и отладкой.

Ответ №2:

Я думаю, вам следует использовать этот метод.

 request.get_json()
  

Смотрите это для получения более подробной информации request.get_json

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

1. Оки. API работает нормально, когда я использую Postman для его тестирования. Все еще я должен использовать request.get_json()?

2. Да, попробуйте использовать : try: username = request.json_get('username') except: #other stuff

3. Я исправил это с помощью request.get_json().get(‘имя пользователя’). Но все та же проблема. @app.route(‘/api/users’, методы=[‘POST’]) def new_user(): > имя пользователя = request.get_json().get(‘имя пользователя’) Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘get’ apa/routes.py:22: ошибка атрибута