gpt4 book ai didi

python - 让 Python 装饰器与 Hug API 框架配合使用

转载 作者:行者123 更新时间:2023-12-01 03:12:52 26 4
gpt4 key购买 nike

我对 Python 还很陌生。我正在使用 Hug 构建一个简单的 API。我正在尝试使用装饰器来处理所有未处理的异常,如下面的代码所示。但看来我没有在装饰器中正确传递 Hug 所需的输入。

auth.py

from functools import wraps

import hug
from falcon import HTTP_400, HTTP_500

import store
import validator
from user_entity import UserEntity


def _error(dict, response, status=HTTP_400):
response.status = status
return {'errors': dict}


def handle_exceptions(f):
"""Handle all non-handled exceptions."""
@wraps(f)
def decorated(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception as e:
return _error({'message': str(e)}, HTTP_500)
return decorated


@hug.post('/')
@handle_exceptions
def create_user(username, password, response):
"""Validate and create a user in the database."""
is_valid, vres = validator.validate_user(username, password)
if not is_valid:
return _error(
{k: v for k, v in vres.items() if v is not None}, response)

user = UserEntity(username=username, password=password)
urn, usr = user.db_view()
store.create_user(urn, usr)

return user.public_view()

这是我得到的错误:

Traceback (most recent call last):  
File "auth.py", line 23, in decorated
return f(*args, **kwargs)
TypeError: create_user() missing 1 required positional argument: 'response'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wsgiref/handlers.py", line 137, in run
self.result = application(self.environ, self.start_response)
File "/Users/munjal/.virtualenvs/utl-identity-auth-server/lib/python3.6/site-packages/falcon/api.py", line 189, in __call__
responder(req, resp, **params)
File "/Users/munjal/.virtualenvs/utl-identity-auth-server/lib/python3.6/site-packages/hug/interface.py", line 651, in __call__
self.render_content(self.call_function(**input_parameters), request, response, **kwargs)
File "/Users/munjal/.virtualenvs/utl-identity-auth-server/lib/python3.6/site-packages/hug/interface.py", line 595, in call_function
return self.interface(**parameters)
File "/Users/munjal/.virtualenvs/utl-identity-auth-server/lib/python3.6/site-packages/hug/interface.py", line 117, in __call__
return __hug_internal_self._function(*args, **kwargs)
File "auth.py", line 25, in decorated
return _error({'message': str(e)}, HTTP_500)
File "auth.py", line 14, in _error
response.status = status
AttributeError: 'str' object has no attribute 'status'

最佳答案

您忘记了

中的 response 参数
return _error({'message': str(e)}, HTTP_500)

而且我认为装饰器一般不起作用。 Hug 通过 function.__code__.co_varnames 标识必要的参数。这不会被 functools.wraps 修改。使用装饰器后,hug.post 看到的是一个带有参数 *args、*kwargs 的函数,这没有帮助。

您可以将您的路由器与ExceptionRouter链接起来

关于python - 让 Python 装饰器与 Hug API 框架配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42737147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com