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自带的错误处理,比如:
这样会返回Tornado默认的403错误页面。(r"/launch.py", tornado.web.ErrorHandler, {"status_code": 403}),
内容的提问来源于stack exchange,提问作者Nikhil VJ
相关产品推荐
相关产品推荐

