Files
2026-07-13 13:10:28 +08:00

176 lines
6.3 KiB
Python
Executable File

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import os.path
import torndb
import tornado.escape
from tornado import gen
import tornado.httpserver
import tornado.ioloop
import tornado.options
import libs.common as common
import libs.stock_web_dic as stock_web_dic
import web.dataTableHandler as dataTableHandler
import web.dataEditorHandler as dataEditorHandler
import web.dataIndicatorsHandler as dataIndicatorsHandler
import web.base as webBase
import pandas as pd
import numpy as np
import akshare as ak
import bokeh as bh
import sqlalchemy
import json
class Application(tornado.web.Application):
def __init__(self):
handlers = [
# 设置路由
(r"/", HomeHandler),
(r"/stock/", HomeHandler),
(r"/api/v1/package_verison", PackageVersionHandler),# 包版本
(r"/api/v1/menu_list", MenuListHandler), # 菜单接口
(r"/test_akshare", TestHandler),# 测试页面,做写js 测试。
(r"/test2", Test2Handler),# 测试页面,做写js 测试。
# 使用datatable 展示报表数据模块。
(r"/api/v1/api_data", dataTableHandler.GetStockDataHandler),
(r"/stock/data", dataTableHandler.GetStockHtmlHandler),
# 数据修改dataEditor。
(r"/data/editor", dataEditorHandler.GetEditorHtmlHandler),
(r"/data/editor/save", dataEditorHandler.SaveEditorHandler),
# 获得股票指标数据。
(r"/api/v1/data/indicators", dataIndicatorsHandler.GetDataIndicatorsHandler),
]
settings = dict( # 配置
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
xsrf_cookies=False, # True,
# cookie加密
cookie_secret="027bb1b670eddf0392cdda8709268a17b58b7",
debug=True,
default_encoding="utf-8",
)
super(Application, self).__init__(handlers, **settings)
# Have one global connection to the blog DB across all handlers
self.db = torndb.Connection(
charset="utf8", max_idle_time=3600, connect_timeout=1000,
host=common.MYSQL_HOST, database=common.MYSQL_DB,
user=common.MYSQL_USER, password=common.MYSQL_PWD)
# 获得包版本 handler。
class PackageVersionHandler(webBase.BaseHandler):
@gen.coroutine
def get(self):
pandasVersion = pd.__version__
numpyVersion = np.__version__
sqlalchemyVersion = sqlalchemy.__version__
akshareVersion = ak.__version__
bokehVersion = bh.__version__
# 返回包的版本信息。
obj = {
"code": 20000,
"message": "success",
"pandasVersion" : pandasVersion,
"numpyVersion" : numpyVersion,
"sqlalchemyVersion" : sqlalchemyVersion,
"akshareVersion" : akshareVersion,
"bokehVersion" : bokehVersion,
"stockstatsVersion": "0.3.2"
}
# logging.info("####################")
# logging.info(obj)
self.write(json.dumps(obj))
# 获得菜单列表数据 handler。
class MenuListHandler(webBase.BaseHandler):
@gen.coroutine
def get(self):
leftMenuList = stock_web_dic.STOCK_WEB_DATA_LIST
out_data = []
menu_name = ''
menu_children = []
index = 0
for table_info in leftMenuList:
print(table_info.name)
index = index + 1
# 使用 children 作为二级菜单。
tmp_menu = {
"name": table_info.name,
"path": "/stock/table/" + table_info.table_name
}
menu_children.append(tmp_menu)
# 使用 type作为 一级目录
if menu_name != table_info.type or index == len(leftMenuList):
# 进行数据循环
if menu_name != '' :
if index != len(leftMenuList):
menu_children.pop() # 删除当前的节点信息。
tmp_children = list(menu_children)
tmp_menu2 = {
"name": menu_name,
"path": "#",
"children": tmp_children
}
# 下一个数据清空和放置。
menu_children = []
menu_children.append(tmp_menu)
out_data.append(tmp_menu2)
menu_name = table_info.type
obj = {
"code": 20000,
"message": "success",
"data": out_data
}
print(out_data)
# self.write(json.dumps(o
self.write(json.dumps(obj))
# 首页handler。
class HomeHandler(webBase.BaseHandler):
@gen.coroutine
def get(self):
print("################## index.html ##################")
pandasVersion = pd.__version__
numpyVersion = np.__version__
akshareVersion = ak.__version__
bokehVersion = bh.__version__
#stockstatsVersion = ss.__version__ # 没有这个函数,但是好久不更新了
# https://github.com/jealous/stockstats
self.render("index.html", pandasVersion=pandasVersion, numpyVersion=numpyVersion,
akshareVersion=akshareVersion, bokehVersion=bokehVersion,
stockstatsVersion="0.3.2",
pythonStockVersion = common.__version__,
leftMenu=webBase.GetLeftMenu(self.request.uri))
class TestHandler(webBase.BaseHandler):
@gen.coroutine
def get(self):
self.render("test_akshare.html", entries="hello",
pythonStockVersion=common.__version__,
leftMenu=webBase.GetLeftMenu(self.request.uri))
class Test2Handler(webBase.BaseHandler):
@gen.coroutine
def get(self):
self.render("test2.html", entries="hello",
pythonStockVersion=common.__version__,
leftMenu=webBase.GetLeftMenu(self.request.uri))
def main():
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(Application())
port = 9090
http_server.listen(port)
# tornado.options.options.logging = "debug"
tornado.options.parse_command_line()
tornado.ioloop.IOLoop.current().start()
if __name__ == "__main__":
main()