1

Tornado で 401 ステータス コードを送信しても、IE/Firefox でパスワード プロンプトが表示されません。

import tornado.ioloop
import tornado.web

class UserHandler(tornado.web.RequestHandler):
    def get(self, user_id):
        self.set_header('WWW-Authenticate', 'Basic realm="users"')
        self.send_error(status_code=401)

application = tornado.web.Application([
    (r"/users/(\w+)", UserHandler),
],debug=True)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

さらに、WWW-Authenticate ヘッダーは応答ヘッダーに表示されません。401 ステータスを送信しない場合、ヘッダーには表示されますが、パスワード プロンプトは表示されません。

4

2 に答える 2

1

理由はわかりませんが、これは機能します。

import tornado.ioloop
import tornado.web

class UserHandler(tornado.web.RequestHandler):
    def get(self, user_id):
        self.set_status(401)
        self.set_header('WWW-Authenticate', 'Basic realm=Users')

application = tornado.web.Application([
    (r"/users/(\w+)", UserHandler),
],debug=True)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
于 2013-01-09T03:09:19.063 に答える
1

sourceに見られるように、「[r]すべてのヘッダーとコンテンツをリセットする」 を呼び出すため、(set_status()の代わりに を使用して) 見つけたソリューションが機能します。次に、ステータス コードに基づいて新しいコンテンツとヘッダーを送信するために呼び出します。send_error()send_error()clear()write_error()

すべてのコンテンツとヘッダーを手動で (または独自の方法で) 設定してエラーを処理しても問題ない場合は、絶対に使用しないでくださいsend_error()

RequestHandlerのメソッドを変更しsend_error()て、あなたに反対するのではなく、あなたのために働くこともできることがわかりました。ヘッダーはすべての応答の予期される部分であるため、自動的に追加されると便利WWW-Authenticateです。これは、オーバーライドすることで実行できます:401send_error(401)write_error()

class BaseHandler(RequestHandler):
    def write_error(self, status_code, **kwargs):
        if status_code == 401:
            self.add_header(
                'WWW-Authenticate',
                'Basic realm=' + json.dumps(self.realm))  # adds quotes
        super(BaseHandler, self).write_error(status_code, **kwargs)

class UserHandler(BaseHandler):
    realm = 'Users'
    # ...
于 2015-04-08T22:36:34.870 に答える