4

AppEngineでの開発にwebapp2を使用しています。私がやりたいのは、エラーが発生した場合にカスタムJSON形式の応答を送信することです。たとえば、リクエストの長さがしきい値よりも長い場合、HTTP400とレスポンスボディで応答します

{'error':'InvalidMessageLength'}

webapp2には、特定の例外にエラーハンドラーを割り当てるオプションがあります。例えば:

app.error_handlers[400] = handle_error_400

handle_error_400は次のとおりです。

def handle_error_400(request, response, exception):
    response.write(exception)
    response.set_status(400)

webapp2.RequestHandler.abort(400)実行されると、上記のコードが実行されます。

上記の設定に基づいて、動的に異なる応答形式(HTMLとJSON)を使用するにはどうすればよいですか?つまり、どのようにして異なるバージョンのhandle_error_400関数を呼び出すことができるのでしょうか。

4

1 に答える 1

5

これは、すべての種類のエラーに対して同じエラーハンドラーを使用する方法を示す完全に機能する例であり、URLがで始まる場合/json、応答は次のようになります(オブジェクトをapplication/jsonうまく利用して何を決定するかについて想像力を働かせてください)request提供する必要のある応答の種類):

import webapp2
import json

def handle_error(request, response, exception):
  if request.path.startswith('/json'):
    response.headers.add_header('Content-Type', 'application/json')
    result = {
        'status': 'error',
        'status_code': exception.code,
        'error_message': exception.explanation,
      }
    response.write(json.dumps(result))
  else:
    response.write(exception)
  response.set_status(exception.code)

app = webapp2.WSGIApplication()
app.error_handlers[404] = handle_error
app.error_handlers[400] = handle_error

404上記の例では、テストするのが最も簡単なエラーであるを返す次のURLにアクセスすることで、さまざまな動作を簡単にテストできます。

http://localhost:8080/404
http://localhost:8080/json/404
于 2013-03-26T23:34:18.797 に答える