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

  1. soft/
  2. ├── bin # 程序执行文件目录
  3.    ├── __init__.py
  4.    └── start.py # 程序开始执行脚本文件
  5. ├── conf # 配置文件目录
  6.    ├── config.ini # 配置文件
  7.    ├── __init__.py
  8.    ├── my_log_settings.py # 日志文件配置脚本
  9.    └── settings.py # 配置脚本
  10. ├── core # 核心模块
  11.    ├── core.py # 核心功能脚本
  12.    └── __init__.py
  13. ├── db # 数据文件目录
  14. ├── lib # 库文件目录
  15.    ├── __init__.py
  16.    └── read_ini.py # 库脚本文件
  17. └── log # 日志目录
  18. └── all2.log # 日志文件

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

bin/

  1. import sys,os
  2.  
  3. BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取项目的根目录
  4. sys.path.append(BASE_DIR) # 将项目的根目录添加到环境变量中
  5.  
  6. from core import core
  7. from conf import my_log_settings
  8.  
  9. if __name__ == '__main__':
  10. my_log_settings.load_my_logging_cfg()
  11. core.run()

start.py

conf/

  1. [DEFAULT]
  2. user_timeout = 1000
  3.  
  4. [hkey]
  5. password = 123
  6. money=10000000000

config.ini

  1. import os
  2. import logging.config
  3.  
  4. # 定义三种日志输出格式 开始
  5.  
  6. standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
  7. '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
  8.  
  9. simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  10.  
  11. id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
  12.  
  13. # 定义日志输出格式 结束
  14.  
  15. logfile_dir = r'%s\log' %os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # log文件的目录
  16.  
  17. logfile_name = 'all2.log' # log文件名
  18.  
  19. # 如果不存在定义的日志目录就创建一个
  20. if not os.path.isdir(logfile_dir):
  21. os.mkdir(logfile_dir)
  22.  
  23. # log文件的全路径
  24. logfile_path = os.path.join(logfile_dir, logfile_name)
  25.  
  26. # log配置字典
  27. LOGGING_DIC = {
  28. 'version': 1,
  29. 'disable_existing_loggers': False,
  30. 'formatters': {
  31. 'standard': {
  32. 'format': standard_format
  33. },
  34. 'simple': {
  35. 'format': simple_format
  36. },
  37. },
  38. 'filters': {},
  39. 'handlers': {
  40. #打印到终端的日志
  41. 'console': {
  42. 'level': 'DEBUG',
  43. 'class': 'logging.StreamHandler', # 打印到屏幕
  44. 'formatter': 'simple'
  45. },
  46. #打印到文件的日志,收集info及以上的日志
  47. 'default': {
  48. 'level': 'DEBUG',
  49. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
  50. 'formatter': 'standard',
  51. 'filename': logfile_path, # 日志文件
  52. 'maxBytes': 1024*1024*5, # 日志大小 5M
  53. 'backupCount': 5,
  54. 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  55. },
  56. },
  57. 'loggers': {
  58. #logging.getLogger(__name__)拿到的logger配置
  59. '': {
  60. 'handlers': ['default'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  61. 'level': 'DEBUG',
  62. 'propagate': True, # 向上(更高level的logger)传递
  63. },
  64. },
  65. }
  66.  
  67. def load_my_logging_cfg():
  68. logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
  69. logger = logging.getLogger(__name__) # 生成一个log实例
  70. logger.info('It works!') # 记录该文件的运行状态
  71.  
  72. if __name__ == '__main__':
  73. load_my_logging_cfg()

my_log_settings.py

settings.py

  1. import os
  2. config_path=r'%s\%s' %(os.path.dirname(os.path.abspath(__file__)),'config.ini')
  3. user_timeout=10
  4. user_db_path=r'%s\%s' %(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),\
  5. 'db')

settings.py

core/

  1. import logging
  2. import time
  3. from conf import settings
  4. from lib import read_ini
  5.  
  6. config=read_ini.read(settings.config_path)
  7. logger=logging.getLogger(__name__)
  8.  
  9. current_user={'user':None,'login_time':None,'timeout':int(settings.user_timeout)}
  10. def auth(func):
  11. def wrapper(*args,**kwargs):
  12. if current_user['user']:
  13. interval=time.time()-current_user['login_time']
  14. if interval < current_user['timeout']:
  15. return func(*args,**kwargs)
  16. name = input('name>>: ')
  17. password = input('password>>: ')
  18. if config.has_section(name):
  19. if password == config.get(name,'password'):
  20. logger.info('登录成功')
  21. current_user['user']=name
  22. current_user['login_time']=time.time()
  23. return func(*args,**kwargs)
  24. else:
  25. logger.error('用户名不存在')
  26.  
  27. return wrapper
  28.  
  29. @auth
  30. def buy():
  31. print('buy...')
  32.  
  33. @auth
  34. def run():
  35.  
  36. print('''
  37. 1. 购物
  38. 2. 查看余额
  39. 3. 转账
  40. ''')
  41. while True:
  42. choice = input('>>: ').strip()
  43. if not choice:continue
  44. if choice == '':
  45. buy()
  46.  
  47. if __name__ == '__main__':
  48. run()

core.py

lib/

  1. import logging
  2. import time
  3. from conf import settings
  4. from lib import read_ini
  5.  
  6. config=read_ini.read(settings.config_path)
  7. logger=logging.getLogger(__name__)
  8.  
  9. current_user={'user':None,'login_time':None,'timeout':int(settings.user_timeout)}
  10. def auth(func):
  11. def wrapper(*args,**kwargs):
  12. if current_user['user']:
  13. interval=time.time()-current_user['login_time']
  14. if interval < current_user['timeout']:
  15. return func(*args,**kwargs)
  16. name = input('name>>: ')
  17. password = input('password>>: ')
  18. if config.has_section(name):
  19. if password == config.get(name,'password'):
  20. logger.info('登录成功')
  21. current_user['user']=name
  22. current_user['login_time']=time.time()
  23. return func(*args,**kwargs)
  24. else:
  25. logger.error('用户名不存在')
  26.  
  27. return wrapper
  28.  
  29. @auth
  30. def buy():
  31. print('buy...')
  32.  
  33. @auth
  34. def run():
  35.  
  36. print('''
  37. 1. 购物
  38. 2. 查看余额
  39. 3. 转账
  40. ''')
  41. while True:
  42. choice = input('>>: ').strip()
  43. if not choice:continue
  44. if choice == '':
  45. buy()
  46.  
  47. if __name__ == '__main__':
  48. run()

read_ini.py

log/

all2.log

[ python ] 软件开发规范的更多相关文章

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

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

  2. Python软件开发规范

    bin  整个程序的执行路口    start.py conf 配置文件     setting.py lib   库  模块与包    common.py    sql.py core  核心逻辑  ...

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

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

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

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

  5. Python 3 软件开发规范

    Python 3 软件开发规范 参考链接 http://www.cnblogs.com/linhaifeng/articles/6379069.html#_label14 对每个目录,文件介绍. #= ...

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

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

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

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

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

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

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

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

随机推荐

  1. 【刷题】BZOJ 4196 [Noi2015]软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  2. [JSOI2007]字符加密 后缀数组

    题面:洛谷 题解: 我们考虑,如果可以将环上每个长度为len的串都提取出来,再做个排序,那这题我们就做出来了! 但是提取$n^2$,怎么办? 考虑破环成链,再扩充为原来的2倍. 然后直接做后缀排序,把 ...

  3. OI队测题解:

    Test 17   T1: 题目大意: 喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树. 所有星球间的双向航线的长度都为1.小昕要在若干个星球建矿石仓库,设立每个仓库的费用为K.对于未 ...

  4. Codeforces Round #441 Div. 2题解

    比赛的时候E调了好久...F没时间写T T A:直接走到短的路上来回走就好了 #include<iostream> #include<cstring> #include< ...

  5. 树莓派安装python3.5

    https://gist.github.com/BMeu/af107b1f3d7cf1a2507c9c6429367a3b Installing Python 3.5 on Raspbian As o ...

  6. 小程序navigatorTo缺点和修正方法

    1.不好带参数跳转到tabbar,即下部的导航栏目. reLauntch方法可以传递参数到导航栏目: go_to_prolist: function (e) { var datatype = e.cu ...

  7. mysql 中delete和trncate区别

    mysql中删除表记录delete from和truncate table的用法区别: MySQL中有两种删除表中记录的方法:(1)delete from语句,(2)truncate table语句. ...

  8. php优秀网摘

    1.thinkphp的目录结构设计经验总结 说明:thinkphp3.2.3对类没有深刻的认识,对项目规模和架构有很糟糕的影响.这里写的目录结构和设计模式相当于对3.2添加了面向对象架构.第二个链接是 ...

  9. OpenCV---色彩空间(二)HSV追踪颜色对象和通道分离与合并

    一:HSV追踪有颜色对象 def inRange(src, lowerb, upperb, dst=None) #lowerb是上面每个颜色分段的最小值,upperb是上面每个颜色分段的最大值,都是列 ...

  10. JS函数大全 莫名其妙找到的

    1 .document.write(""); 输出语句 2 .JS中的注释为// 3 .传统的HTML文档顺序是:document->html->(head,body) ...