Spyne Fault - HTTP返回代码

时间:2017-06-21 10:53:56

标签: python http exception spyne

我已阅读有关Spyne Faults(http://spyne.io/docs/2.10/manual/03_types.html)的信息,但无法通过400返回代码正确地提出错误。我正确地形成了故障响应,但是当我需要返回400时,使用500 HTTP返回码。

@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错误。 (我知道如果 - 其他是坏的,我只是想在我正确编写代码之前获得一个概念验证工作)

我认为我需要对故障进行子类化,而不仅仅是提高它,但是我无法理解它。我潜入了code / protocol / soap / soap11,发现fault_to_http_reponse_code只返回HTTP 500.

提前致谢

1 个答案:

答案 0 :(得分:1)

我放弃了子类方法,而只更新了soap11.py中的fault_to_http_reponse_code函数。它是一个重要的补丁,但它完成了我想要的工作。

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)

有些人会采取正确的方法来解决这个问题。