#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: ошибка атрибута