天天看点

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