主要结构
下面进行解释。
App目录职责
app用于存放程序需要运行的逻辑。
如下:
common里面是通用的函数及方法。
business用于存放业务逻辑
dal专门用于数据库读写
db是数据库操作辅助类
modules用于存放tornado的handler,即页面控制器。
viewhelper是用于页面的一些辅助方法,譬如,页面上面需要裁剪字符串,需要获取通用页脚的文章数据,需要获取页头的通用分类数据等等。
值得注意的是BaseHandler这个类,这个类可以自定义404错误,也可以自定义采用的模板,所有handler都继承这个BaseHandler。
代码如下:
#coding:utf-8
#这是一份默认的handler,用于替换掉默认的模板引擎为mako。
import tornado.web
import os.path
import tornado.ioloop
import mako.lookup
import tornado.httpserver
import mako.template
import app.common.commons
class BaseHandler(tornado.web.RequestHandler):
def initialize(self):
template_path = self.get_template_path()
self.lookup = mako.lookup.TemplateLookup(directories=[template_path], input_encoding='utf-8', output_encoding='utf-8')
#self._config = Config()
#self.lookup = mako.lookup.TemplateLookup(directories=[template_path])
#def get_conf(self,field,key):
# return self._config.get(field,key)
def render_string(self, template_path, **kwargs):
try:
_debug=self.get_argument("debug","false")
template = self.lookup.get_template(template_path)
namespace = self.get_template_namespace()
namespace.update(kwargs)
#siteConfig=WebConfig()
env_kwargs = dict(
handler = self,
request = self.request,
locale = self.locale,
_ = self.locale.translate,#国际化i18n的支持
static_url = self.static_url,
xsrf_form_html = self.xsrf_form_html,
reverse_url = self.application.reverse_url,
jsDebug=_debug,
#get_conf = self.get_conf,
#加一个我们的相关设定下去。
#conf=siteConfig
)
env_kwargs.update(kwargs)
return template.render(**env_kwargs)
except Exception as e:
print("服务端错误")
print(e)
pass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Conf目录职责
conf目录用于存放程序的相关配置文件及信息,例如:
其中一份配置如下:
# -*- coding: utf-8 -*-
#开发环境
#--总体设置
[global]
db_prefix=ecs_
[web]
template_path=views
static_path=static
#--数据库设置
[db]
#mysql ip
host = localhost
#mysql port
port = 3306
#db name
db = ectouch
user = root
password = root
#--mongo数据库配置
[mongo]
#host
host=127.0.0.1
#port
port=27017
#db
db=base_db
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
都差不多的。
views职责
views是存放控制器需要渲染的模板的目录,例如:
static职责
static是静态文件目录,包含了样式,脚本,页面的前端逻辑等东西,同时也有一些第三方插件在。例如:
upload职责
你还看到了upload这个文件夹,请注意,tornado除了static目录是默认可以在外面直接访问到以外,其余文件夹下面的文件都没办法直接通过http访问的,假如要添加这种http直接访问,那么需要进行设置,这里先说明一下。upload的职责是小型网站上传图片时候的存放。
application、server及url路径设置
这几个文件都是启动tornado服务,设定访问地址的核心文件。
url和url_admin分别是设定前台访问路径和后台访问路径的文件,分开两个是因为便于管理。
内容分别是:
#coding:utf-8
import sys
import tornado.web
import os
from app.web.modules.testModule import index as TestIndex
from app.web.modules.PC import *
url=[
#(r"/data/(.*)", tornado.web.StaticFileHandler,{"path":"data"})#这是data静态文件,用自定义静态文件的路由。
(r"/test",TestIndex)
#pc版页面,
,(r"/index\.html",pc_index)
]
1
2
3
4
5
6
7
8
9
10
11
12
13
#coding:utf-8
import sys
import tornado.web
import os
##这是后台相关页面。
from app.web.modules.admin.index import *
url_admin=[
(r"/admin/login\.html",admin_login)
,(r"/admin/index\.html",admin_index)
,(r"/admin/center\.html",admin_center)
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
application是设定tornado程序的核心文件,如下:
from url import *
import tornado.web
import os
from app.conf.config import *
from url_admin import *
setting = dict(
template_path=os.path.join(os.path.dirname(__file__), "views"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
)
handlers=[]
##根据web.ini设定相关参数
def application_setting_handle():
_config=WebConfig()
setting["template_path"]=_config.cf.get("web","template_path")
setting["static_path"]=_config.cf.get("web","static_path")
#--这里要加入静态文件的直接访问。
handlers.append((r"/data/(.*)", tornado.web.StaticFileHandler,{"path":"data"}))#这是data静态文件,用自定义静态文件的路由。
handlers.append((r"/images/(.*)", tornado.web.StaticFileHandler,{"path":"images"}))#这是images静态文件,用自定义静态文件的路由。
handlers.append((r"/upload/(.*)", tornado.web.StaticFileHandler,{"path":"upload"}))#这是上传的静态文件,用自定义静态文件的路由。
handlers.extend(url)#pc端页面。
handlers.extend(url_admin)#后台相关页面,
application_setting_handle()
application = tornado.web.Application(
handlers=handlers,
**setting
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server.py是启动服务器的入口,内容如下:
import os
import tornado.ioloop
import tornado.options
import tornado.httpserver
import sys
from app.conf.config import *
from application import application
from tornado.options import define,options
define("port",default=8123,help="run on th given port",type=int)
def main():
#读取server的配置文件。
conf_server=ServerConfig()
options.port=int(conf_server.getPort())
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
print('Development server is running at http://127.0.0.1:%s/' % options.port)
print('Quit the server with Control-C')
tornado.ioloop.IOLoop.instance().start()
if __name__=="__main__" or 1==1:
main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server.py
# -*- coding:utf-8 -*-
import os
import redis
import torndb
import config
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver
from tornado.options import options
from tornado.web import RequestHandler
tornado.options.define("port",type=int,default=8800,help="服务器端口")
"""Base基类"""
class BaseHandler(RequestHandler):
"""@property 装饰器 将db做为 BaseHandler 的属性调用"""
@property
def db(self):
return self.application.db
def set_default_headers(self):
#http请求头
self.set_header("Access-Control-Allow-Origin", "*")
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
self.set_header("Content-Type", "application/json; charset=UTF-8")
def post(self):
pass
def get(self):
pass
def options(self):
self.set_status(204)
self.finish()
"""创建一个Application类把数据库连接和redis绑定到Application里"""
class Application(tornado.web.Application):
def __init__(self,*args,**kwargs):
"""这个handlers也能剥离出去单写个文件"""
handlers = [
(r"/", IndexHandler)
]
tornado.web.Application.__init__(self,handlers,**config.settings)
self.db = torndb.Connection(**config.mysql_config)
self.redis = redis.StrictRedis(**config.redis_config)
class IndexHandler(BaseHandler):
"""这里继承BaseHandler 所以才能用self.db"""
def get(self):
data = self.db.query("select * from stus")
import json
datas = json.dumps(data)
self.write(datas)
def post(self):
jsons = {
"name":"hahaha",
"age":"45"
}
self.write(jsons)
def main():
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
print "The Server Run In: http://127.0.0.1:%d"%options.port
main()
config.py
# -*- coding:utf-8 -*-
import os
"""Application配置参数"""
settings = dict(
static_path = os.path.join(os.path.dirname(__file__), 'static'),
templates_path = os.path.join(os.path.dirname(__file__), 'templates'),
cookie_secret = "9bTzIuvlRtWWo9wpc4/6aFOL5Ub1uUFrs4x6bIHBqZc=",
xsrf_cookies = True,
debug = True,
)
"""MySQL配置参数"""
mysql_config = dict(
host = "127.0.0.1",
database = "test1",
user = "root",
password = "1113"
)
"""Redis配置参数"""
redis_config = dict(
host = "127.0.0.1",
port = "6379"
)
总结
一个项目的组织方式是多种多样的,这里只是说一说我自己的组织方式,请指正。
1845

被折叠的 条评论
为什么被折叠?



