Python 3 软件开发规范

参考链接 http://www.cnblogs.com/linhaifeng/articles/6379069.html#_label14

对每个目录,文件介绍。

 #=============>bin目录:存放执行脚本

 #start.py

 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()

 #=============>conf目录:存放配置文件

 #config.ini

 [DEFAULT]

 user_timeout = 1000

 [egon]

 password = 123

 money = 10000000

 [alex]

 password = alex3714

 money=10000000000

 [yuanhao]

 password = ysb123

 money=10

 #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')

 #my_log_settings.py

 """

 logging配置

 """

 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', 'console'],  # 这里把上面定义的两个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()

 #=============>core目录:存放核心逻辑

 #core.py

 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('''

 购物

 查看余额

 转账

     ''')

     while True:

         choice = input('>>: ').strip()

         if not choice:continue

         if choice == '':

             buy()

 if __name__ == '__main__':

     run()

 #=============>db目录:存放数据库文件

 #alex_json

 #egon_json

 #=============>lib目录:存放自定义的模块与包

 #read_ini.py

 import configparser

 def read(config_file):

     config=configparser.ConfigParser()

     config.read(config_file)

     return config

 #=============>log目录:存放日志

 #all2.log

 [2017-07-29 00:31:40,272][MainThread:11692][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:31:41,789][MainThread:11692][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:31:46,394][MainThread:12348][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:31:47,629][MainThread:12348][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:31:57,912][MainThread:10528][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:32:03,340][MainThread:12744][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:32:05,065][MainThread:12916][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:32:08,181][MainThread:12916][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:32:13,638][MainThread:7220][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:32:23,005][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:32:40,941][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:32:47,222][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:32:51,949][MainThread:7220][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:33:00,213][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:33:50,118][MainThread:8500][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:33:55,845][MainThread:8500][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:34:06,837][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:34:09,405][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:34:10,645][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]

Python 3 软件开发规范的更多相关文章

  1. python中软件开发规范,模块,序列化随笔

    1.软件开发规范 首先: 当代码都存放在一个py文件中时会导致 1.不便于管理,修改,增加 2.可读性差 3.加载速度慢 划分文件1.启动文件(启动接口)--starts文件放bin文件里2.公共文件 ...

  2. Python模块的导入以及软件开发规范

    Python文件的两种用途 1 . 当脚本直接使用,直接当脚本运行调用即可 def func(): print("from func1") func() 2 . 当做模块被导入使用 ...

  3. python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)

    一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...

  4. python(37)- 软件开发规范

    软件开发规范 一.为什么要设计好目录结构? 1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 2 ...

  5. Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)

    Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型) 一丶软件开发规范 六个目录: #### 对某 ...

  6. Python 入门之 软件开发规范

    Python 入门之 软件开发规范 1.软件开发规范 -- 分文件 (1)为什么使用软件开发规范: 当几百行--大几万行代码存在于一个py文件中时存在的问题: 不便于管理 修改 可读性差 加载速度慢 ...

  7. python软件开发规范&分文件对于后期代码的高效管理

    根据本人的学习,按照理解整理和补充了python模块的相关知识,希望对于一些需要了解的python爱好者有帮助! 一.软件开发规范--分文件 当代码存在一个py文件中时: 1.不便于管理 (修改,增加 ...

  8. python27期day16:序列化、json、pickle、hashlib、collections、软件开发规范、作业。

    序列化模块:什么是序列化呢? 序列化的本质就是将一种数据结构(如字典.列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化.将这个字典直接写入文件是不可以的,必须转化成字符串的形式, ...

  9. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

随机推荐

  1. surface4 笔盖失灵的解决方案

    http://tieba.baidu.com/p/3670357234 先找到设备管理器,找到蓝牙,删除里面所有的设备.然后重启. 之后再次找到蓝牙,匹配pen.就可以用了. 解决的前提是:我确定笔帽 ...

  2. 简洁方便的集合处理——Java 8 stream流

    背景 java 8已经发行好几年了,前段时间java 12也已经问世,但平时的工作中,很多项目的环境还停留在java1.7中.而且java8的很多新特性都是革命性的,比如各种集合的优化.lambda表 ...

  3. linux系统寻找僵尸进程

    1. 用top命令来查看服务器当前是否有僵尸进程. 2. 用ps和grep命令寻找僵尸进程 $ ps -A -ostat, pid, ppid, cmd | grep -e '^[Zz]' 命令解释: ...

  4. centos7设置ip

    centos7不能再通过setup命令来设置ip了,但可以通过修改网卡配置文件来设置ip 在/etc/sysconfig/network-scripts目录下找到网卡配置文件,修改之前内容如下 TYP ...

  5. CentOS6.9 下编译安装MySQL5.7.19

    官网:https://www.mysql.com/ 下载地址:https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.19.tar.gz 一.准备工作 ...

  6. Parencodings - poj 1068

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22764   Accepted: 13344 Description L ...

  7. 检测session用户信息跳转首页界面

    方案一:采用jsp方式检测用户信息跳转 <%@ page language="java" pageEncoding="UTF-8"%> <%@ ...

  8. CONTROLLER_NAME 常量 当前访问的控制器

    CONTROLLER_NAME 常量 当前访问的控制器

  9. mysql-proxy做客户端连接转发【外网访问内网mysql】

    功能 用于外网客户端连接内网的MySQL,将此工具安装在中转服务器上. 软件版本 mysql-proxy-0.8.1-linux-rhel5-x86-64bit.tar.gz 简单的配置过程 解压后有 ...

  10. 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js

    iOS js oc相互调用(JavaScriptCore)   从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这 ...