You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3 Tornado服务器:限制特定文件与文件夹访问权限

如何在Tornado中禁止访问特定文件和文件夹?

我正在使用Python3启动Tornado Web服务器,以下是简化的启动代码:

import os
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()

该服务器运行正常,index.html周边存在各类文件与文件夹,访问localhost:5005可查看index.html内容,也能通过URL直接访问所有文件。但当前可通过localhost:5005/launch.py在浏览器中查看整个程序代码,我希望禁止此类访问,同时阻止浏览器访问某个特定子文件夹的内容,但保留其他所有文件与文件夹的默认全访问状态,请问该如何实现?


解决方案

要搞定这个需求其实很简单,咱们可以利用Tornado路由的匹配优先级——先定义的路由会先被匹配。只需要在静态文件路由之前,先加上针对禁止访问的文件和文件夹的拦截规则,就能把这些请求挡在外面,同时不影响其他文件的正常访问。

1. 拦截特定文件(比如你的launch.py)

咱们可以写个简单的Handler来处理这些被禁止的请求,返回403禁止访问的状态码;也可以直接用Tornado自带的ErrorHandler来返回默认的错误页面,看你喜好。

2. 拦截特定子文件夹

同理,添加匹配该子文件夹所有内容的路由,只要请求指向这个文件夹下的任何内容,都直接拦截。

下面是修改后的完整代码,注释已经写得很清楚了:

import os
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')

# 自定义一个禁止访问的Handler,返回403和提示信息
class ForbiddenHandler(tornado.web.RequestHandler):
    def get(self):
        self.set_status(403)
        self.write("不好意思,这个资源禁止访问哦")
    
    # 别忘了处理POST等其他请求方法,确保全面拦截
    def post(self):
        self.set_status(403)
        self.write("不好意思,这个资源禁止访问哦")

def make_app():
    return tornado.web.Application([
        (r"/API/allStops", allStops),
        # 重点:把禁止规则放在最前面,优先匹配
        # 拦截单个文件:launch.py
        (r"/launch.py", ForbiddenHandler),
        # 拦截特定子文件夹,比如叫"private_files"的文件夹,匹配它下面所有内容
        (r"/private_files/.*", ForbiddenHandler),
        # 原来的静态文件路由放在最后,处理剩下的所有请求
        (r"/(.*)", tornado.web.StaticFileHandler, {"path": root, "default_filename": startPage})
    ])

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

额外小技巧:批量拦截所有Python文件

如果你不想只拦截launch.py,而是所有.py后缀的文件都不让访问,只需要把单个文件的路由改成下面这样:

(r"/.*\.py$", ForbiddenHandler),

这样所有以.py结尾的文件请求都会被直接拦截,再也不用担心源码泄露啦。

划重点提醒

  • 路由顺序绝对不能搞反:禁止访问的规则必须放在静态文件路由的前面,不然静态文件路由会先匹配到请求,拦截就完全没用了。
  • 如果你不想自定义提示内容,也可以直接用Tornado自带的错误处理,比如:
    (r"/launch.py", tornado.web.ErrorHandler, {"status_code": 403}),
    
    这样会返回Tornado默认的403错误页面。

内容的提问来源于stack exchange,提问作者Nikhil VJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:21:10