Flask错误:AttributeError:'NoneType'对象没有属性'get'

问题描述 投票:0回答:2

我正在使用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
python rest flask flask-restful flask-login
2个回答
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,因为如果密钥不存在或者没有发布json,你将收到服务器500错误。使用Web API,即使帖子格式错误,也可以将响应返回给客户端,这有助于更复杂的API和调试。


0
投票

我认为你应该使用request.get_json()方法。

有关详细信息,请参阅此内容request.get_json

© www.soinside.com 2019 - 2024. All rights reserved.