Ошибка Spyne — коды возврата HTTP

Я прочитал информацию о сбоях Spyne (http://spyne.io/docs/2.10/manual/03_types.html), но не могу понять, как правильно вызвать ошибку с кодом возврата 400. У меня правильно формируется ответ Fault, но с кодом возврата HTTP 500, когда у меня есть требование вернуть 400.

@srpc(Boolean, _returns=String)
def requestConfiguration(value):
    #if value is true, get all the data
    if value == True:
        #todo - get the config
        return 'True Received'

    else:
        # if anything other than True is received, MUST respond with a SOAP fault and HTTP 400
        raise Fault(faultcode="Client.", faultstring="Value must be True")
        # raise error.InvalidInputError("problem", "problem")

Чтение некоторой документации (http://spyne.io/docs/2.10/modules/spyne/model/fault.html#Fault), я интерпретирую это как FaultCode, который должен быть строкой, начинающейся с Client, и он вернет ошибку 400. (Я знаю, что если-иначе это плохо, я просто пытаюсь получить доказательство работоспособности концепции, прежде чем я напишу код правильно)

Я думаю, что мне нужно подклассифицировать ошибку, а не просто поднимать ее, но я не могу понять это. Я погрузился в код /protocol/soap/soap11 и увидел, что fault_to_http_reponse_code просто возвращает HTTP 500.

заранее спасибо


person user3262678    schedule 21.06.2017    source источник


Ответы (1)


Я отказался от подхода подкласса, вместо этого я просто обновил функцию fault_to_http_reponse_code в soap11.py. Это грубый патч, но он делает то, что я хочу.

def fault_to_http_response_code(self, fault):
    from spyne.const.http import HTTP_400, HTTP_401, HTTP_404, HTTP_405, HTTP_413, HTTP_500
    from spyne.error import Fault, InternalError, ResourceNotFoundError, RequestTooLongError, RequestNotAllowed, InvalidCredentialsError
    if isinstance(fault, RequestTooLongError):
        return HTTP_413
    if isinstance(fault, ResourceNotFoundError):
        return HTTP_404
    if isinstance(fault, RequestNotAllowed):
        return HTTP_405
    if isinstance(fault, InvalidCredentialsError):
        return HTTP_401
    if isinstance(fault, Fault) and (fault.faultcode.startswith('Client.')
                                            or fault.faultcode == 'Client'):
        return HTTP_400

    return HTTP_500

Затем я просто поднимаю обычную ошибку с кодом ошибки, начинающимся с Client.

raise Fault(faultcode="Client.", faultstring="value must be True)

Надеюсь, кто-то поможет с правильным подходом к этому.

person user3262678    schedule 26.06.2017