Tornado 框架还是比较灵活的.
我按照示例,将Handler代码放在,主启动文件里面,
如下

#完整打分流程V2
import os
import os.path
# import sys
# sys.path.append('../') 

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import cv2 
import json 
from handlerss import Handlers #,IndexHandler,IndexHaHaHandler,OnlineRecognitionHandler

# import handlers

from tornado.options import define, options 


# 定义端口用于指定HTTP服务监听的端口
# 如果命令行中带有port同名参数则会称为全局tornado.options的属性,若没有则使用define定义。
define("port", type=int, default=8000, help="run on the given port")
# 调试模式
define("debug", type=bool, default=True, help="debug mode")


# windows 系统下 tornado 使用 使用 SelectorEventLoop 解决一个bug start
import platform
if platform.system() == "Windows":
    import asyncio
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
# windows 系统下 tornado 使用 使用 SelectorEventLoop 解决一个bug  end



class AAHandler(tornado.web.RequestHandler):
    # 定义get方法对HTTP的GET请求做出响应
    def get(self):
        print("Get")
        self.write("hello world AA")


if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[ 
            (r'/', AAHandler),  
         ],
        template_path=os.path.join(os.path.dirname(__file__), "templates"),
        settings = { 'static_path' : os.path.join(os.path.dirname(__file__), 'static')  }
    )
    http_server = tornado.httpserver.HTTPServer(app)
    print("web 服务正在监听",options.port)
    http_server.listen(options.port)
    print("web 服务已启动...")
    
    tornado.ioloop.IOLoop.instance().start()

然后访问http://localhost:8000 这样是没问题的.
但是总不能把所有的 Handler 都放在这一个文件中吧.
于是我新建了一个Handlers 目录将 AAHandler 类的代码移到了 AAHandler.py文件中.
代码改成这样的.
记一次低级错误 Tornado总是返回 404: Not Found_json

StartWeb.py中代码改成

#完整打分流程V2
import os
import os.path
# import sys
# sys.path.append('../') 

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import cv2 
import json 
from handlers import AAHandler # 注意这里的改动
..... #中间代码省略, 抓住重点
if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[ 
            (r'/', handlers.AAHandler), # 注意这里的改动
         ]
         ,..... #中间代码省略, 抓住重点
    )
   ..... #中间代码省略, 抓住重点
   tornado.ioloop.IOLoop.instance().start()
  

此时再次访问http://localhost:8000 返回 404: Not Found
为此我甚至跟踪了tornado 的源代码, 最后无意中查看了网上的代码. 突然间发现我犯了一个非常低级的错误… import 的文件名和里面的类名是一模一样的. 导致了概念混淆.
Python中的文件名的地位是很重要的, .net中 文件名则跟类名无关. 文件名可以任意变化…
这一点我觉得, 还是.Net略高一筹…

所以我改了一下文件名避免混淆.

记一次低级错误 Tornado总是返回 404: Not Found_中间代码_02

from handlers import AA # 注意这里的改动
..... #中间代码省略, 抓住重点
if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[ 
            (r'/', AA.AAHandler), # 注意这里的改动
         ]
         ,..... #中间代码省略, 抓住重点
    )
   ..... #中间代码省略, 抓住重点
   tornado.ioloop.IOLoop.instance().start()
  

这样就可以了…