一、項目結構:
需求:易維護,可擴充
1、files 配置資訊 (docs)
2、handlers 處理邏輯和路由映射 C控制層
3、libs 庫檔案 做一些中間層的封裝 作用:解耦合
4、models 是模型類 M模型層 包括:資料庫,檔案系統,第三放服務
5、static 放js css html img
6、utils 小工具小元件,比如:驗證碼生成、IP位址轉換
7、templates 放html頁面
8、config 配置檔案 要有兩套 一套給開發用 一套給線上用
9、server 啟動檔案
10、requirement 所需依賴
二、總體思路
1、建立項目結構檔案
2、編寫配置檔案以及運作檔案
3、編寫basehandler
4、資料庫連接配接和redis連接配接編寫
5、編寫主handler 和main_handler_url
6、建立模闆templates/index.html
7、運作python server.py -start 測試
三、目錄結構
四、代碼部分
所需依賴
appdirs==.
futures==.
netaddr==.
packaging==
pbkdf2==
Pillow==.
pkg-resources==.
pycket==.
PyMySQL==.
pyparsing==.
qiniu==.
redis==.
requests==.
SQLAlchemy==.
tornado==.
torndb==
1、配置檔案
#coding=utf-8
settings = dict(
template_path='templates', #設定模闆路徑
static_path='static', #設定靜态檔案路徑
debug=True, #調試模式
cookie_secret='aaaa', #cookie加密方式
login_url='/auth/user_login', #auth 指定預設的路徑
xsrf_cookies=True, #防止跨域攻擊
#ui_methods=admin_uimethods,
#pycket配置資訊
pycket={
'engine': 'redis',
'storage': {
'host': 'localhost',
'port': ,
'db_sessions': ,
'db_notifications': ,
'max_connections': ** ,
},
'cookies': {
'expires_days':, #設定過期時間
#'max_age':5000,
}
}
)
2、啟動檔案
#coding=utf-8
import tornado.httpserver
import tornado.web
import tornado.ioloop
import tornado.escape
from tornado.options import define, options
from config import settings
from handlers.main.main_urls import handlers
#定義一個預設的接口
define("port", default=, help="run port",type=int)
define("start", default=False, help="start server", type=bool)
if __name__ == "__main__":
options.parse_command_line()
if options.start:
app = tornado.web.Application(handlers, **settings) #建立應用執行個體
http_server = tornado.httpserver.HTTPServer(app) #通過應用執行個體建立伺服器執行個體
http_server.listen(options.port) #監聽端口
print 'start server...'
tornado.ioloop.IOLoop.instance().start() #啟動服務
3、資料庫連接配接配置
#coding=utf-8
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 連接配接資料庫的資料
HOSTNAME = '192.168.169.138'
PORT = '3306'
DATABASE = 'tornado_pro'
USERNAME = 'developer'
PASSWORD = '123456'
# DB_URI的格式:dialect(mysql/sqlite)+driver://username:[email protected]:port/database?charset=utf8
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,
PASSWORD,
HOSTNAME,
PORT,
DATABASE
)
# 1建立一個engine引擎
engine = create_engine(DB_URI, echo=False )
# 2sessionmaker生成一個session類
Session = sessionmaker(bind=engine)
# 3建立一個session執行個體
dbSession = Session()
# 4建立一個模型基類
Base = declarative_base(engine)
4、redis連接配接
#coding=utf-8
import redis
conn = redis.Redis()
5、初始化 BaseHandler
、繼承tornado.web.RequestHandler, SessionMixin
、建立資料庫和redis的連接配接執行個體
、重寫方法get_current_user(self) 如果要使用authenticated方法
、清除連接配接執行個體中的資料
#coding=utf-8
import tornado.escape
from libs.pycket.session import SessionMixin
from libs.db.dbsession import dbSession
from libs.redis_conn.redis_conn import conn
from models.account.account_user_model import User
users = {
'user': User
}
class BaseHandler(tornado.web.RequestHandler, SessionMixin):
def initialize(self): #初始化連接配接 db為mysql的資料庫連接配接執行個體 conn為redis的連接配接執行個體
self.db=dbSession
self.conn=conn
def get_current_user(self): #重寫方法 如果要使用authenticated方法
"""擷取目前使用者"""
username = self.session.get("user_name")
if username:
user = users[username['user_tablename']].by_id(username['user_id'])
return user if user else None
else:
return None
def on_finish(self): #清除連接配接中的資料
self.db.close()
6、編寫main_handler
#coding=utf-8
import tornado.web
from handlers.base.base_handler import BaseHandler
class MainHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
self.render('index.html')
7、編寫main_handler_url
from main_handler import MainHandler
handlers = [
(r'/',MainHandler),
]