34

私は現在、HTTPの不正なリクエストを発生させるために以下を使用しています:

raise tornado.web.HTTPError(400)

HTML出力を返します:

<html><title>400: Bad Request</title><body>400: Bad Request</body></html>

カスタムボディで HTTP 応答コードだけを返すことは可能ですか?

4

7 に答える 7

46

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>")
于 2012-12-06T00:29:25.247 に答える
26

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,
                })
于 2012-12-06T08:01:08.023 に答える
5
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] は、ステータス コードに基づいて「ページが見つかりません」などのエラー コード テキストを返します。

于 2012-12-18T11:53:22.890 に答える
1

この交換は、ここで提案されたアプローチのいくつかを明確にし、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 には存在しません)。したがって、ここでやろうとしていることを実行する最良の方法ではない可能性があります (HTTPErrorlog_messageフィールドは少し優れていますが、それでも理想的ではありません。 ) を使用する代わりに、独自の例外を発生させるだけHTTPErrorです。write_errorオーバーライドself.set_status(400)は、適切な種類の例外を検出したときに使用できます。"

于 2015-05-04T11:28:51.503 に答える