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文件中.
代码改成这样的.
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略高一筹…
所以我改了一下文件名避免混淆.
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()
这样就可以了…