天天看點

tornado項目--day01--項目結構以及項目搭建編寫

一、項目結構:

​ 需求:易維護,可擴充

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 測試

三、目錄結構

tornado項目--day01--項目結構以及項目搭建編寫

四、代碼部分

所需依賴

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),
]