ValueError: 视图没有返回 HttpResponse 对象

时间:2021-05-02 07:10:08

标签: python python-3.x django httpresponse

我正在编写一个 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'

0 个答案:

没有答案
相关问题