我正在编写一个 Django 服务器。我不得不为我的 API 类使用通用视图。现在,每当我使用邮递员测试代码时,一切正常。但是,如果我使用其他客户端(如 Talend API 测试器或 Chrome 浏览器)对其进行测试,则会返回 500 错误,表示 API 未返回任何 HttpResponse 对象。这是我的骨架代码库
如果我禁用 csrf_exempt,我会收到 csrf_exempt 错误。如果我启用它,我会得到返回 None 的类。
@method_decorator(csrf_exempt, name='dispatch')
class ClassName(View):
@throttle
def post(self, request) -> JsonResponse:
try:
data = (json.loads(request.body))
except JSONDecodeError:
# decoding error of Json File.
msg = "An error occurred while decoding the input"
return message_handler(msg, 500)
number = data.get("number", None)
if number is None:
msg = "number key is missing from the payload"
return message_handler(msg, 400)
if len(number) == 0:
msg = "number number cannot be an empty string"
return message_handler(msg, 400)
if len(number) > 30:
msg = "Maximum 30 characters are supported for car number key"
return message_handler(msg, 400)
......
some other application logic
......
return JsonResponse({
"status": True,
"message": "",
}, status=200)
def message_handler(message: str, status_code: int, status: bool = False) -> JsonResponse:
return JsonResponse({
"status": status,
"message": message,
}, status=status_code)
我所有的 API 都使用相同的格式,它们都返回一个 JsonResponse,那么我做错了什么?
更新 #1: 消息处理程序是一个通用函数。还有其他五个响应,所有响应都使用通用函数。代码已更新。
更新 #2
错误似乎与装饰器(节流阀)有关。所以这是油门代码:
def throttle(function):
@functools.wraps(function)
def wrapper(self, request, *args, **kwargs):
try:
last_request_at = request.session[LAST_REQUEST_KEY]
except KeyError:
last_request_at = None
reequest.session[LAST_REQUEST_KEY] = last_request_at
return function(self, request, *args, **kwargs)
return wrapper
如果将 @method_decorator(throttle, name='post')
放在类上,我会收到以下错误
TypeError: wrapper() missing 1 required positional argument: 'request'