2012-09-27 3 views
25

Python 및 Flask를 사용하여 RESTful API를 설계하고 있습니다. 예상대로 API는 API 요청을 수신하고 모두 정상적으로 처리되면 데이터를 반환해야하지만 오류가 발생하면 오류가 발생하지 않도록 적절하게 오류를 반환해야합니다. 오류가 발생하면 일반적으로 예외를 발생 시키지만이 경우 사용자에게 오류 메시지를 반환해야합니다 (try-catch 블록?).Python 및 Flask로 API 오류 메시지 반환

현재 오류를 처리하는 방법은 데이터와 오류를 모두 반환하고 각 수준에서 데이터를 확인하고 마지막으로 데이터 또는 오류를 API 함수의 호출자에게 반환하는 것입니다 .

이 문제는 여러 수준의 함수 호출이있을 때 번거롭기 때문에 데이터와 오류를 여러 번 전달하고 매번 검사를 수행해야합니다.

더 좋은 방법이 있나요? 오류 전파를 좀 더 간단하고 우아하게 만들기 위해 내가 할 수있는 개선점은 무엇입니까?

def get_data() 
    data1, error = get_some_data() # function not shown 
    if data1 is None: 
     return None, "could not retrieve data1" 
    data2, error = get_some_other_data() # function not shown 
    if data2 is None: 
     return None, "could not retrieve data2" 
    return (data1, data2), None 

@app.route("/api/method", methods=['GET']) 
def method(): 
    data, error = get_data() 
    if data is None: 
     if error is None: 
      error = "unknown error" 
     return json.dumps({ "error": error }), 500 
    return json.dumps({ "data": data }), 200 
+0

예외를 사용하지 않는 이유는 무엇입니까? – georg

+0

그러면 json 형식으로 적절한 메시지가없는 내부 서버 오류가 반환됩니다. Facebook API 스타일을 생각해보십시오. – Ryan

+0

@ thg435에 동의합니다. 저에게 try ... except는 당신의 "방법"을 조금 정리할 것입니다. 오류 처리 블록을 "except"블록으로 옮기고 오류 메시지를 반환 할 수 있습니다. 이것이 Ajax 호출로 장고에서하는 방법입니다. 또한, 나는 플라스크에 대한 경험이 없지만 이것이 RESTful (ish) API 인 경우. 그리고 그것은 "GET"으로 가고 있기 때문에 나타나는 것입니다. 적절한 상태 코드를 반환해야합니다. 상황이 괜찮 으면 200 또는 4XX 또는 500 (기본 문제가 무엇인지에 따라 다름) –

답변

21

당신은 클라이언트에 적절한 HTTP 코드를 반환하는 abort(http_code)를 사용하거나 비에 http 예외를 발생시킬 수있다 : 여기

내가 현재 오류를 반환하고있어 방법의 예입니다. @app.errorhandler() 데코레이터를 사용하여 http 오류 및 임의의 예외에 대한 사용자 지정 처리기를 제공하십시오. 또한 예외를 처리 할 준비가 된 일반 try/except 블록을 사용할 수도 있습니다. 파이썬은 예외가 아닙니다.

+0

나는 non-http 예외와 @ app.errorhandler() 아이디어를 인상하는 것을 좋아한다. 플라스크 설명서에서 그 내용을 살펴보고 작동 방법을 확인하겠습니다. – Ryan

+0

이 접근법은 훌륭했습니다. 감사! – Ryan

+0

+1 -'errorhandler'와'throw' 예외는 실제로 정확한 답입니다. –