Tornado-04、Tornado出力および応答ヘッダ


Tornado出力と応答ヘッダ
1、出力
前の文章03、Tornadoの入力と出力はwriteに対して初歩的な理解を持っていますこの文章はまずwriteを深く理解してみましょうまず私たちは前回のtornadoフォルダの下でlesson 3フォルダを新設しました実際には、writeは直接データをフロントエンドに返すのではなく、キャッシュエリアに書いて、関数が終わってからフロントエンドに戻ります.新しいstart 1を検証します.pyファイルに基本コードを追加したら、次のコードを追加します.
class FlushHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('11111111111' + '
') self.write('22222222222' + '
') self.write('There comes a flush' + '
') self.flush() import time time.sleep(5) self.write('33333333333' + '
') self.write('There no flush' + '
') self.write('The function is almost over!')

ここではselfの有無が明らかになりますflush()の場合、結果は違います.もしあるならば、先に前の出力を見ることができて、ないならば、関数の実行が終わってからやっといっしょに印刷することができます.self.flush()は、現在の出力バッファをWebページにリフレッシュすることです.
上のselfを除いてflush()のほかにselfもあります.finish()は関数のreturnに似ており、実行するとselfは後で実行できないことに注意する必要があります.write、関数プロトタイプ:
RequestHandler.finish(chunk = None)
finish関数の呼び出しが完了するとwrite関数を呼び出すとエラーが発生します
self.finish()
self.write('en~~~~')

エラーメッセージ:RuntimeError:Cannot write()after finish()
指定されたHTTPエラーをブラウザに送信
関数のプロトタイプ:
RequestHandler.send_error(status_code = 500,**kwargs)

flush()が呼び出された場合、エラーを送信することは不可能であるため、この方法は簡単に応答を終了する.出力が書き込み済みでリフレッシュされていない場合は、エラーページに破棄され、置き換えられます.
上書きwrite_error()は、返されるエラーページをカスタマイズします.追加のキーワードパラメータを渡して次のHandlerを追加
class ErrorHandler(tornado.web.RequestHandler):
    def get(self):
        self.send_error(404)
        # self.flush()
        self.send_error(404)  #       self.flush()        

カスタムエラーページを上書き
関数のプロトタイプ:
RequestHandler.write_error(status_code,** kwargs )
write_errorはwrite,render,set_を呼び出すことができるヘッダなど、出力を生成します.ErrorHandlerに次のコードを追加
def write_error(self, status_code, **kwargs):  #   write_error  
    self.write("---%d----
"%status_code)

write_を書き換えるErrorメソッドは、カスタム出力エラーを実現します.
レスポンスのステータスコードの設定
RequestHandler.set_status(status_code,reason = None)

パラメータ:
  • status_code(int)-応答ステータスコード.
  • reason(string)-ステータスコードを記述するヒト可読理由フレーズ.self.set_status(404,'error')

  • 2.レスポンスヘッダの設定
    Googleブラウザを例にとると、F 12を押すと、ブラウザが持っているコンソールを開くことができ、Networkを選択します.ここでは、ブラウザがページに表示されていない情報を見ることができます.開いてリフレッシュし、選択するとGeneral、Respnse Headers、Request Headersが表示されます.
    General:はリクエストの基本情報、Respnse Headersは対応情報、Request Headersはリクエスト情報、サーバ側でブラウザに設定できる対応情報です.次のコードを追加
    (r'/header',HeadersHandler),
    
    class HeadersHandler(tornado.web.RequestHandler):
        def get(self):
            self.write('headers')
            self.set_header('hujing',18)
            self.set_header('changsha','hunan')

    関数のプロトタイプ:
    RequestHandler.set_header(name, value)
    

    値が文字列でない場合は、文字列に変換します.その後、すべてのタイトル値をUTF-8に符号化する
    self.set_ヘッダは自分の必要な応答ヘッダを設定できます
    指定されたレスポンスヘッダと値の追加
    関数のプロトタイプ:
    RequestHandler.add_header(*name*, *value*)
    

    異なるset_header,add_ヘッダーは、同じキーの複数の値を返すために複数回呼び出される場合があります.同じキーset_ヘッダーは1つの値しか返されません
    self.set_header('hujing','20')  #      hujing:20       hujing:18
    self.add_header('hujing','19')  
    self.add_header('changsha','0731')  
    self.add_header('changsha','0321') 
    

    前のset_を元に戻すヘッダ呼び出し
    追加すると削除されます.関数のプロトタイプ:
    RequestHandler.clear_header(name)
    self.clear_header('changsha')

    3.対応するヘッダの実行順序
    class IndexHandler(tornado.web.RequestHandler):
        def set_default_headers(self):
            print(' ---set_default_headers---:  header'+'
    ') def initialize(self): print(' ---initialize---: '+'
    ') def prepare(self): print(' ---prepare---: '+'
    ') def get(self): self.write(' ---get---: get '+'
    ') def post(self): self.write(' ---post---: post '+'
    ') def write_error(self, status_code, **kwargs): print(' ---write_error---: '+'
    ') def on_finish(self): print(' ---on_finish---: , '+'
    ')

    以上がバックグラウンドでの応答の実行順序である.必要に応じて自分の必要な内容を実現することができます.
    この記事のソースコードの合計
    import tornado.httpserver
    import tornado.ioloop
    import tornado.options
    import tornado.web
    from tornado.options import define, options
    
    define('port', default=9000, help='run port', type=int)
    
    
    class FlushHandler(tornado.web.RequestHandler):
        def get(self):
            self.write('11111111111' + '
    ') self.write('22222222222' + '
    ') self.write('There comes a flush' + '
    ') self.flush() import time time.sleep(5) self.write('33333333333' + '
    ') self.write('There no flush' + '
    ') self.write('The function is almost over!') class ErrorHandler(tornado.web.RequestHandler): def get(self): self.send_error(404) # self.set_status(404, 'error') def write_error(self, status_code, **kwargs): # write_error self.write("--%d--
    " % status_code) class HeadersHandler(tornado.web.RequestHandler): def get(self): self.write('headers') self.set_header('hujing', 18) self.set_header('changsha', 'hunan') self.set_header('hujing', '20') # 1 self.add_header('hujing', '19') # 2 self.add_header('changsha', '0731') # 3 self.add_header('changsha', '0321') # 4 if __name__ == '__main__': tornado.options.parse_command_line() print(options.port) # terminal app = tornado.web.Application( handlers=[ (r'/flush', FlushHandler), (r'/error', ErrorHandler), (r'/header', HeadersHandler), ], template_path='templates', ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()