【问题标题】:Flask error : AttributeError: 'NoneType' object has no attribute 'get'烧瓶错误:AttributeError:'NoneType'对象没有属性'get'
【发布时间】:2019-08-14 12:12:19
【问题描述】:

我正在使用 Flask 开发 RESTful API。我正在编写 pytest 案例来测试 /api/users 路径。在测试时,我遇到了错误。 我正在使用 SQL 炼金术。我对 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


    【解决方案1】:

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

    更多详情请参阅request.get_json

    【讨论】:

    • 好吧。当我使用 Postman 对其进行测试时,API 工作正常。我仍然应该使用 request.get_json() 吗?
    • 是的,尝试使用:try: username = request.json_get('username') except: #other stuff
    • 我使用 request.get_json().get('username') 修复了它。但仍然是同样的问题。 @app.route('/api/users', methods=['POST']) def new_user(): > username = request.get_json().get('username') E AttributeError: 'NoneType' 对象没有属性'get' apa/routes.py:22: AttributeError
    【解决方案2】:

    问题在于您如何发布 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.

    一般来说,如果您尝试从发布到 API 的 json 获取密钥,最好使用 try/except 进行包装,因为如果密钥不存在或不存在,您将收到服务器 500 错误json 已发布。使用 Web API,即使帖子格式错误,也希望能够向客户端返回响应,这有助于更复杂的 API 和调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-13
      • 2021-10-15
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      相关资源
      最近更新 更多