Python Eve:当我发送 PATCH 和 DELETE 请求时出现类型错误

Python Eve: TypeError when I send PATCH and DELETE request

我正在使用 Eve 进行 REST API。 Eve 在 Nginx 上 运行,在 Docker 容器上是 uwsgi。

Python 版本: 3.6.5

夏娃: 0.8

Eve-SQLAlchemy: 0.5.0

当我发送资源和项目的 GET 请求时,没有问题。 但是,当我发送 PATCH 或 DELETE 请求时,API 服务器 returns Nginx 的默认 50xError 页面。

日志是这样的:

    [pid: 12|app: 0|req: 22/22] 192.168.99.1 () {46 vars in 691 bytes} [Wed Jun  6 22:55:26 2018] PATCH /maintenances/18 => generated 0 bytes in 11 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/eve/flaskapp.py", line 1043, in __call__
    return super(Eve, self).__call__(environ, start_response)
  File "/usr/lib64/python3.6/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/lib64/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/lib64/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib64/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/lib64/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/lib64/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/lib64/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib64/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/lib64/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/lib64/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/lib/python3.6/site-packages/eve/endpoints.py", line 96, in item_endpoint
    response = patch(resource, **lookup)
  File "/usr/lib/python3.6/site-packages/eve/methods/common.py", line 297, in rate_limited
    return f(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/eve/auth.py", line 78, in decorated
    return f(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/eve/methods/common.py", line 1181, in decorated
    r = f(resource, **combined_args)
  File "/usr/lib/python3.6/site-packages/eve/methods/patch.py", line 41, in patch
    skip_validation=False, **lookup)
  File "/usr/lib/python3.6/site-packages/eve/methods/patch.py", line 134, in patch_internal
    original = get_document(resource, concurrency_check, **lookup)
  File "/usr/lib/python3.6/site-packages/eve/methods/common.py", line 80, in get_document
    **lookup)
TypeError: find_one() takes 3 positional arguments but 5 were given

当我从请求中删除身份验证时,服务器 returns "Please provide proper credentials," 但是当我从请求中删除 "If-Match" header 时,服务器 returns这个错误。 (因此,可能是身份验证和 etag 验证之间存在的某些过程是导致此错误的原因。

问题

这几乎可以肯定与 Eve 和 Eve-SQLAlchemy 之间的版本不兼容有关。 Eve-SQLAlchemy 0.5 仅支持 Eve 0.6,目前没有可用版本支持较新的 Eve 版本。

这也符合你看到的TypeErrorfind_one()是Eve-SQLAlchemy提供的数据层的方法。可能界面在 Eve 0.7 或 0.8 中发生了变化。

从这里去哪里

如果您使用的是 pip,那么 pip check 应该报告安装错误,因为 Eve-SQLAlchemy 声明它依赖于 Eve>=0.6,<0.7(参见 https://github.com/pyeve/eve-sqlalchemy/blob/586cec403daabaeab8f7cbe133275d5fcc4e4bf3/setup.py#L35)。

要解决此问题,请在 setup.py and/or requirements.txt 中删除任何将 Eve 固定到不兼容的版本,或者如果这不会改变任何内容,请添加 Eve<0.7 .不幸的是,pip 本身并不总是能够为所有依赖项确定一组不矛盾的版本,因此有时需要指导才能这样做。