私は現在、HTTPの不正なリクエストを発生させるために以下を使用しています:
raise tornado.web.HTTPError(400)
HTML出力を返します:
<html><title>400: Bad Request</title><body>400: Bad Request</body></html>
カスタムボディで HTTP 応答コードだけを返すことは可能ですか?
RequestHandler.send_error
メソッドをシミュレートできます:
class MyHandler(tornado.web.RequestHandler):
def get(self):
self.clear()
self.set_status(400)
self.finish("<html><body>My custom body</body></html>")
Tornadoは出力エラーを呼び出すため、Tornadoのドキュメントで提案されているように、 VisioNのアプローチのRequestHandler.write_error
代替手段がオーバーライドされます。このアプローチの利点は、以前と同じようにレイズできることです。HTTPError
のソースRequestHandler.write_error
はここにあります。以下に、write_errorの簡単な変更の例を示します。これにより、ステータスコードの設定が変更され、kwargsで理由を指定した場合に出力が変更されます。
def write_error(self, status_code, **kwargs):
if self.settings.get("serve_traceback") and "exc_info" in kwargs:
# in debug mode, try to send a traceback
self.set_header('Content-Type', 'text/plain')
for line in traceback.format_exception(*kwargs["exc_info"]):
self.write(line)
self.finish()
else:
self.set_status(status_code)
if kwargs['reason']:
self.finish(kwargs['reason'])
else:
self.finish("<html><title>%(code)d: %(message)s</title>"
"<body>%(code)d: %(message)s</body></html>" % {
"code": status_code,
"message": self._reason,
})
def write_error(self, status_code, **kwargs):
#Function to display custom error page defined in the handler.
#Over written from base handler.
data = {}
data['code'] = status_code
data['message'] = httplib.responses[status_code]
# your other conditions here to create data dict
self.write(TEMPLATES.load('error.html').generate(data=data))
self.send_error ()呼び出しが開始されるたびに、 write_error()関数が要求ハンドラーによって呼び出されます。したがって、ここでカスタム エラー データ dict を作成し、それをカスタム エラー ページに表示できます。
http.responses[status_code] は、ステータス コードに基づいて「ページが見つかりません」などのエラー コード テキストを返します。
この交換は、ここで提案されたアプローチのいくつかを明確にし、reason
キーワードを割引します (私が試してみようと考えていました)。
Q: (by mrtn)
「エラー応答に独自の理由を渡すために使用したいのですが、メソッドraise tornado.web.HTTPError(400, reason='invalid request')
をオーバーライドすることでこれを実現したいと考えていますwrite_error (self, status_code, **kwargs)
。
self._reason
「しかし、私が望んでいるものではなく、内部にしかアクセスできwrite_error
ないようです。私も試しkwargs['reason']
ましたが、それは存在しません。」
A: (Tornado の主任開発者 @bendarnell による)
「エラーを公開した例外は、キーワード引数write_error
のトリプルとして利用exc_info
できます。次のような方法で理由フィールドにアクセスできます。
if "exc_info" in kwargs:
e = kwargs["exc_info"][1]
if isinstance(e, tornado.web.HTTPError):
reason = e.reason
「しかし、フィールドは本質的に非推奨であることに注意してくださいreason
(HTTP/2 には存在しません)。したがって、ここでやろうとしていることを実行する最良の方法ではない可能性があります (HTTPError
のlog_message
フィールドは少し優れていますが、それでも理想的ではありません。 ) を使用する代わりに、独自の例外を発生させるだけHTTPError
です。write_error
オーバーライドself.set_status(400)
は、適切な種類の例外を検出したときに使用できます。"