2014-03-07 3 views
0

나는 지불을 처리하려고하는데, 지불이 성공했는지 실패했는지 고객에게 알릴 필요가 있습니다. 실패 할 경우 고객에게 알리고 오류를 통보 받아 모든 오류를 이메일로 보내 주어야합니다. 나는이 함께 왔어요 :왜 내 예외가 올바르게 처리되지 않습니까?

@app.route('/charge/',methods=['POST']) 
def charge(): 
    try: 
     # charge payment using Stripe checkout 
     ... 
     ... 
     # done processing  
     flash('Thanks!') 
     return jsonify() 
    except: 
     flash("Error") 
     raise 

AJAX를 통해 응답을 수신하면 내 플래시 메시지가 표시되도록, 스트라이프 체크 아웃 페이지를 다시로드합니다. 트랜잭션이 성공하면 페이지가 다시로드되고 "감사합니다!"라는 메시지가 나타납니다. 플래시 메시지가 표시되지만 성공하지 못하면 페이지가 다시로드되지만 "오류"플래시 메시지가 표시되지 않습니다.

왜?

편집 : 내가 변경하는 경우를 제외하고는 :

except: 
     flash("Error") 
     print "THIS IS PRINTING" 
     raise 

예외가 발생하기 직전에 내 콘솔에 인쇄됩니다 "이것은 인쇄입니다." 플래시 메시지가 여전히 페이지 새로 고침에 표시되지 않습니다.

+1

실패한 트랜잭션이 예외를 발생시키지 않았습니까? except 블록에 아무것도 넣지 마십시오. 전혀 실행되지 않습니까? – Aerovistae

+0

예. 그렇습니다. 내 서버에서 예외가 발생합니다. – user3287829

+0

@Aerovistae : 제 편집 – user3287829

답변

1

코드에서 어떤 식 으로든 페이지를 다시로드하지 않아 예외가 템플릿으로 다시 전송되지 않은 후에 발생하는 플래시 메시지를 언급하고 있습니다. 앞의 주석에서 언급했듯이 raise 메서드는 예외를 처리하지 않고 단순히 다시 발생시킵니다. 인쇄 문은 볼 수 있지만 플래시 메시지는 볼 수없는 이유는 바로 이것입니다. 즉, 인쇄는 콘솔에서 실행되지만 플래시 메시지는 실행 되더라도 모든 템플릿으로 전달되지 않습니다.

이 될 일을하는 올바른 방법은 :

@app.route('/charge/',methods=['POST']) 
def charge(): 
    try: 
     # charge payment using Stripe checkout 
     ... 
     ... 
     # done processing  
     flash('Thanks!') 
     return jsonify() 
    except: 
     flash("Error") 
     return redirect('/charge/') 

또한, jsonify의 사용은() 올바르지 않습니다. 다음과 같아야합니다 : jsonify(*data to be converted, in dictionary form preferably*).

전자 메일을 통해 사용자에게 알리려면 먼저 전자 메일 라이브러리를 올바르게 설치, 구성 및 초기화해야합니다. Flask-mail을 사용 중이거나 사용 중이라고 가정합니다. 코드는 다음과 같을 수 있습니다.

@app.route('/charge/',methods=['POST']) 
    def charge(): 
     try: 
      # charge payment using Stripe checkout 
      ... 
      ... 
      # done processing  
      flash('Thanks!') 
      return jsonify() 
     except Exception as err: 
      flash("Error") 
      msg = Message("Hi there, you have this error:"+err+" on page '/charge/'. Jolly good!",sender="[email protected]", recipients=["[email protected]"]) 
      return redirect('/charge/') 
+0

매우 포괄적입니다. 감사! – user3287829

0

except 블록에서 raise 예외는 없습니다. 이것은 단순히 클라이언트에게 아무것도 반환하지 않을 것입니다. 페이지를 리디렉션하거나 다시로드 할 수 있습니까? 어쨌든 당신은 무언가를 돌려 보내야합니다.

+0

을 참조하십시오. 문제가 발생하면 사용자와 본인 모두에게 경고 할 방법이 없습니다. – user3287829

관련 문제