19


自分の index.html ファイルを Tornado で処理するためのより良い方法があるかどうかを知りたいです。

すべてのリクエストに StaticFileHandler を使用し、特定の MainHandler を使用してメインのリクエストを処理します。StaticFileHandler のみを使用すると、403: Forbidden エラーが発生しました

GET http://localhost:9000/
WARNING:root:403 GET / (127.0.0.1):  is not a file

ここで私が今やっている方法:

import os
import tornado.ioloop
import tornado.web
from  tornado import web

__author__ = 'gvincent'

root = os.path.dirname(__file__)
port = 9999

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        try:
            with open(os.path.join(root, 'index.html')) as f:
                self.write(f.read())
        except IOError as e:
            self.write("404: Not Found")

application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/(.*)", web.StaticFileHandler, dict(path=root)),
    ])

if __name__ == '__main__':
    application.listen(port)
    tornado.ioloop.IOLoop.instance().start()
4

6 に答える 6

28

Tornado の StaticFileHandler には、デフォルトのファイル名機能が既に含まれていることが判明しました。

Tornado リリース 1.2.0 で機能が追加されました: https://github.com/tornadoweb/tornado/commit/638a151d96d681d3bdd6ba5ce5dcf2bd1447959c

デフォルトのファイル名を指定するには、WebStaticFileHandler の初期化の一部として「default_filename」パラメーターを設定する必要があります。

あなたの例を更新する:

import os
import tornado.ioloop
import tornado.web

root = os.path.dirname(__file__)
port = 9999

application = tornado.web.Application([
    (r"/(.*)", tornado.web.StaticFileHandler, {"path": root, "default_filename": "index.html"})
])

if __name__ == '__main__':
    application.listen(port)
    tornado.ioloop.IOLoop.instance().start()

これはルートリクエストを処理します:

  • /->/index.html

サブディレクトリのリクエスト:

  • /tests/->/tests/index.html

ディレクトリのリダイレクトを正しく処理しているように見えます。これは素晴らしいことです:

  • /tests->/tests/index.html
于 2015-01-11T19:47:30.130 に答える
4

StaticFileHandler明示的に;を追加する必要はありません。static_path を指定するだけで、それらのページが提供されます。

index.htmlURL にファイル名を追加しても、何らかの理由で Tornado がファイルを提供しないため、MainHandler が必要であることは正しいです。

その場合、コードを少し変更するとうまくいくはずです。

import os
import tornado.ioloop
import tornado.web
from tornado import web

__author__ = 'gvincent'

root = os.path.dirname(__file__)
port = 9999

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html")

application = tornado.web.Application([
    (r"/", MainHandler),
    ], template_path=root,
    static_path=root)

if __name__ == '__main__':
    application.listen(port)
    tornado.ioloop.IOLoop.instance().start()
于 2013-01-18T02:56:05.930 に答える
0

これは私のために働いた 竜巻のドキュメントから

ディレクトリが要求されたときにファイルをindex.html自動的に提供するstatic_handler_args=dict(default_filename="index.html")には、アプリケーション設定で設定するかdefault_filenameStaticFileHandler.

于 2016-03-09T17:02:22.207 に答える