# 服務啟動類詳解
> 首先,我們來看下入口文件引用的庫
~~~
# ./web.py
from vendor import logger # 日志庫
from vendor.framework import App 服務啟動類
import os
~~~
> 日志文件:./vendor/logger.py
~~~
# -*- coding=utf-8 -*-
import logging
import logging.handlers
import time, os
'''
日志模塊
'''
# 定義日志保存的目錄
log_path = ('./runtime/log/%s' % time.strftime('%Y-%m'))
if not os.path.exists(log_path):
os.makedirs(log_path)
filename = ('/%s.log' % time.strftime('%d'))
LOG_FILENAME = log_path + filename
logger = logging.getLogger('aiohttp.access')
def set_logger():
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
file_handler = logging.handlers.RotatingFileHandler(
LOG_FILENAME, maxBytes=10485760, backupCount=5, encoding="utf-8")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
set_logger()
~~~
> 服務啟動基類:./vendor/framework/App.py
~~~
from web import ROOT_PATH
import os
import asyncio
from aiohttp import web
from config.config import SYSCONF
# 配置文件全局路由
from config import routes
# 模板文件配置
import aiohttp_jinja2
from jinja2 import FileSystemLoader
# 加載全局中間件
from application.middleware import middlewares
class App(object):
def __init__(self):
self.app = None
self.root_path = ROOT_PATH
# 獲取根目錄
def get_root_path(self):
return self.root_path
# 獲取應用目錄
def get_app_path(self):
return os.path.join(self.root_path, 'application')
def get_loop(self):
return asyncio.get_event_loop()
def create_app(self):
"""
@ 創建應用
@ return: Application
"""
loop = self.get_loop()
self.app = web.Application(loop=loop)
return self.app
def init_templet(self):
"""
@ 模板文件配置
@ return None
"""
path = os.path.join(self.root_path, 'templates')
aiohttp_jinja2.setup(app=self.app, loader=FileSystemLoader(path))
# 靜態文件 注冊路由
self.app.router.add_static('/static', os.path.join(self.root_path, 'static'), append_version=True)
return None
def start_server(self):
"""
@ 啟動服務
@ return:None
"""
self.create_app()
# 加載靜態文件、模板
self.init_templet()
# 注冊中間件
self.load_middlewares()
# 注冊全局路由
routes.reg_routes(self.app)
web.run_app(
self.app,
host=SYSCONF.get('app').get('app_host'),
port=SYSCONF.get('app').get('app_port'),
access_log_format='%a %P "%r" %s bs:[%b] rs:[%Tf] "%{Referer}i" "%{User-Agent}i"')
return None
def load_middlewares(self):
"""
@ 加載全局中間件, 注冊中間件前,一定要先開啟session
@ return:None
"""
for middle in middlewares:
self.app.middlewares.append(middle)
~~~