hukey

在python开发中,我们建议采用如下规范:

soft/
├── bin                        # 程序执行文件目录
│   ├── __init__.py
│   └── start.py            # 程序开始执行脚本文件
├── conf                    # 配置文件目录
│   ├── config.ini            # 配置文件
│   ├── __init__.py
│   ├── my_log_settings.py    # 日志文件配置脚本
│   └── settings.py            # 配置脚本
├── core                    # 核心模块
│   ├── core.py                # 核心功能脚本
│   └── __init__.py
├── db                        # 数据文件目录
├── lib                        # 库文件目录
│   ├── __init__.py
│   └── read_ini.py            # 库脚本文件
└── log                        # 日志目录
    └── all2.log            # 日志文件

 

 

首先在 start.py 中要添加项目的环境变量:

 

bin/

import sys,os

BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    # 获取项目的根目录
sys.path.append(BASE_DIR)    # 将项目的根目录添加到环境变量中

from core import core
from conf import my_log_settings

if __name__ == \'__main__\':
    my_log_settings.load_my_logging_cfg()
    core.run()
start.py

 

 

conf/

[DEFAULT]
user_timeout = 1000

[hkey]
password = 123
money=10000000000
config.ini
import os
import logging.config

# 定义三种日志输出格式 开始

standard_format = \'[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]\' \
                  \'[%(levelname)s][%(message)s]\' #其中name为getlogger指定的名字

simple_format = \'[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s\'

id_simple_format = \'[%(levelname)s][%(asctime)s] %(message)s\'

# 定义日志输出格式 结束

logfile_dir = r\'%s\log\' %os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # log文件的目录

logfile_name = \'all2.log\'  # log文件名

# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)

# log配置字典
LOGGING_DIC = {
    \'version\': 1,
    \'disable_existing_loggers\': False,
    \'formatters\': {
        \'standard\': {
            \'format\': standard_format
        },
        \'simple\': {
            \'format\': simple_format
        },
    },
    \'filters\': {},
    \'handlers\': {
        #打印到终端的日志
        \'console\': {
            \'level\': \'DEBUG\',
            \'class\': \'logging.StreamHandler\',  # 打印到屏幕
            \'formatter\': \'simple\'
        },
        #打印到文件的日志,收集info及以上的日志
        \'default\': {
            \'level\': \'DEBUG\',
            \'class\': \'logging.handlers.RotatingFileHandler\',  # 保存到文件
            \'formatter\': \'standard\',
            \'filename\': logfile_path,  # 日志文件
            \'maxBytes\': 1024*1024*5,  # 日志大小 5M
            \'backupCount\': 5,
            \'encoding\': \'utf-8\',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    \'loggers\': {
        #logging.getLogger(__name__)拿到的logger配置
        \'\': {
            \'handlers\': [\'default\'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            \'level\': \'DEBUG\',
            \'propagate\': True,  # 向上(更高level的logger)传递
        },
    },
}


def load_my_logging_cfg():
    logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
    logger = logging.getLogger(__name__)  # 生成一个log实例
    logger.info(\'It works!\')  # 记录该文件的运行状态

if __name__ == \'__main__\':
    load_my_logging_cfg()
my_log_settings.py

 

 

settings.py

import os
config_path=r\'%s\%s\' %(os.path.dirname(os.path.abspath(__file__)),\'config.ini\')
user_timeout=10
user_db_path=r\'%s\%s\' %(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),\
                     \'db\')
settings.py

 

 

core/

import logging
import time
from conf import settings
from lib import read_ini

config=read_ini.read(settings.config_path)
logger=logging.getLogger(__name__)

current_user={\'user\':None,\'login_time\':None,\'timeout\':int(settings.user_timeout)}
def auth(func):
    def wrapper(*args,**kwargs):
        if current_user[\'user\']:
            interval=time.time()-current_user[\'login_time\']
            if interval < current_user[\'timeout\']:
                return func(*args,**kwargs)
        name = input(\'name>>: \')
        password = input(\'password>>: \')
        if config.has_section(name):
            if password == config.get(name,\'password\'):
                logger.info(\'登录成功\')
                current_user[\'user\']=name
                current_user[\'login_time\']=time.time()
                return func(*args,**kwargs)
        else:
            logger.error(\'用户名不存在\')

    return wrapper

@auth
def buy():
    print(\'buy...\')

@auth
def run():

    print(\'\'\'
1. 购物
2. 查看余额
3. 转账
    \'\'\')
    while True:
        choice = input(\'>>: \').strip()
        if not choice:continue
        if choice == \'1\':
            buy()



if __name__ == \'__main__\':
    run()
core.py

 

 

lib/

import logging
import time
from conf import settings
from lib import read_ini

config=read_ini.read(settings.config_path)
logger=logging.getLogger(__name__)

current_user={\'user\':None,\'login_time\':None,\'timeout\':int(settings.user_timeout)}
def auth(func):
    def wrapper(*args,**kwargs):
        if current_user[\'user\']:
            interval=time.time()-current_user[\'login_time\']
            if interval < current_user[\'timeout\']:
                return func(*args,**kwargs)
        name = input(\'name>>: \')
        password = input(\'password>>: \')
        if config.has_section(name):
            if password == config.get(name,\'password\'):
                logger.info(\'登录成功\')
                current_user[\'user\']=name
                current_user[\'login_time\']=time.time()
                return func(*args,**kwargs)
        else:
            logger.error(\'用户名不存在\')

    return wrapper

@auth
def buy():
    print(\'buy...\')

@auth
def run():

    print(\'\'\'
1. 购物
2. 查看余额
3. 转账
    \'\'\')
    while True:
        choice = input(\'>>: \').strip()
        if not choice:continue
        if choice == \'1\':
            buy()



if __name__ == \'__main__\':
    run()
read_ini.py

 

 

log/

all2.log

 

分类:

技术点:

相关文章: