限制对python tornado Web服务器中某些文件,文件夹的访问

时间:2019-04-19 09:53:55

标签: python tornado

我正在python3中启动龙卷风Web服务器,这是一些简化的启动代码:

import tornado.ioloop, tornado.web
root = os.path.dirname(__file__)
startPage = 'index.html' 

class allStops(tornado.web.RequestHandler):
    def get(self):
        self.write('yo man')

def make_app():
    return tornado.web.Application([
        (r"/API/allStops", allStops),
        (r"/(.*)", tornado.web.StaticFileHandler, {"path": root, "default_filename": startPage})
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(5005)
    tornado.ioloop.IOLoop.current().start()

Web服务器工作正常。我在index.html周围有各种文件和文件夹。因此,当我们在浏览器中打开localhost:5005时,我们会看到index.html(静态网站)的内容,并且其中的链接可以访问所有其他内容。我也可以直接输入URL来直接访问它们。

这就是我的问题所在。如果该程序位于launch.py中,那么我可以通过localhost:5050/launch.py从浏览器中查看整个程序。我想禁止。我还想防止浏览器访问特定子文件夹的内容。但是同时,我不想限制对所有其他文件和文件夹的访问:默认的允许所有状态是好的。我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

子类StaticFileHandler,然后使用validate_absolute_path方法验证文件名。针对您不想提供的文件引发404或403错误。

from tornado import web
from tornado.web import HTTPError

class MyStaticFileHandler(web.StaticFileHandler):
    def validate_absolute_path(self, root, absolute_path):
        if absolute_path.endswith('.py'):
            # raise 403 Forbidden error for all files ending with .py
            raise HTTPError(403)

        return super().validate_absolute_path(root, absolute_path)

然后在您的网址处理程序中使用此类。


自定义错误响应:

如果您设置了debug=False,那么龙卷风将自动显示与状态代码相关的适当消息,而不是异常。

如果要发送自定义错误模板,可以执行以下操作:

...

def validate_absolute_path(self, root, absolute_path):
    if absolute_path.endswith('.py'):
        self.set_status(404)
        # send a custom 404 response from an html file
        with open("path/to/404.html", "r") as f:
            self.write(f.read())

        return None

    return super().validate_absolute_path(root, absolute_path)