zoukankan      html  css  js  c++  java
  • 标准目录结构

     

    1.目录规范 *****

    (1)文件夹的规范写法
    bin 可执行文件
    conf 配置文件
    core 主要业务逻辑
    db 数据文件
    lib 库 (公共代码 第三方模块)
    log 日志文件

    readme 说明文档(是一个文件)
    再以上文件夹中 没有需要作为包的 你的包通常放到lib中 但是注意lib不应该作为包
    疑惑?
    # 这个文件夹到底应该是包还是文件夹 其实问题就是需不需要用到init
    # init的作用就是导入包内模块中的全部功能
    # 通过判断是不是需要这个功能来判断是包还是文件夹

    (2)定制程序的入口
    # 总结 程序的入口 主要是将项目的根目录添加到环境变量中
    (3)分文件夹之后的模块使用
    2.time *****

    一 标准目录规范

    我们学习了模块和包以后,在开发项目就不应该再是面条版,应该分文件,文件夹,那么有没有什么固定的文件

    结构呢?有!这就是我们要说的开发目录规范

    我们通过一个例子来说明这些文件夹的作用

    案例:编写ATM

    #file:"start.py"
    def login():
        #加载文件
        with open("/Users/jerry/PycharmProjects/项目结构/db/db.txt")as f:
            print(f.read())
    def register():
        print('注册'):
    def run():
        
        while True:
        print(
        '''请选择
        1.登录
        2.注册
        '''')
        s = input("请选择:")
        if s=="1":
            login()
        elif:s =="2":
            register()
        else:
            print("error")

     1.在atm中我们市要使用到文件的路径,例如日志文件,数据文件等,并且不止一个地方用很多地方都要用,直接将路径写在代码中,是不不可取的,因为你无可避免的会需要修改这些路径;

    所以不要直接写在代码中,那应该怎么做?定义为变量可行吗?当然 如此一来,修改的时候只需要修改一次即可!

    #file:"start.py"
    #数据路径
    DB_PATH="/users/jerry/PyvharmPro jects/项目结构/db/db.txt"
    #日志路径
    LOG_PATH = "/users/jerry/PycharmProjects/项目结构/db/log.txt
    def login():
        #加载文件
        with open("/Users/jerry/PycharmProjects/项目结构/db/db.txt" as f:
            print(f.read())
    def register():
        print("注册")
    def run():
        while True:
            print(
            """请选择
            1.登录
            2.注册
            """)
            s = input("请选择:")
            if s== "1":
                login()
            elif:s =="2":
                register()
            else:
                print("error")

     但是当你想一想,此类用于配置程序的变量,应该和你的业务逻辑放在一起吗?显然不应该,所以我们将要

    用于配置的信息单独放在一个文件中

    #file:"setting.py"
    #数据路径
    DB_PATH = "/Users/jerry/PycharnProjiects/项目结构/db/db.txt"
    #日志路径
    LOG_PATH = "/User/jerry/PycharmProjects/项目结构/log/log.txt"

    2.在接下来我们需要实现一个道理验证的功能,name这个功能,需要在所有关键操作之前进行验证,也就是

    说很多功能中都要调用这个功能.由于start中代码太多我们呢要进行拆分,这样一来.这个登录验证的代码

    可以将其放置与一个公共的common中

    common.py
    #登录验证装饰器
    def login_auth()
        pass

    3.除此之外,还有日志文件log,数据文件db;

    4.另外我们可以将程序的业务逻辑和启动代码,进行分离,变成start文件和src文件

    start.py专门用于执行启动

    src中的业务逻辑,被star调用

    这样用户使用时就能很快定位到启动文件

    5.在一个启动项目中,可能有多个执行文件那我们可以将其统一到bin文件夹中

    最后一个规范的项目目录应包括一下结构

        
            bin   
            
            core
    
            conf
       
            lib
    
            db
    
            log
    
    readme(介绍文件)

    疑惑:这里的文件夹 是普通文件还是包?

    包的本质就是你文件夹,所以在python项目中,文件夹也就是包,name这里的核心问题是应不应该有init文

    件?

    先明确iinit的作用主要是为了集中所有的功能,让外界方便调用,那我们一个一个来看看是否需要这两个功

    bin排除他是执行文件不需要被导入

    conf配置文件,在你的项目中不可能只有给一个配置文件,比如mysql,oracle,他们明显不是一家,你把他们

    的配置全集中到init文件中,只会给自己带来困扰t

    core业务逻辑,这其中一定有一个用户关系的入口,用户进入以后只能在这些不同业务中来回执行操作,所以

    这个文件夹下的模块是相互调用的关系,不需要集合所有功能给外界调用

    db,lib,log没什么好说的明显不需要

    那什么样的代码该定义为包?例如你有一个下载文件的模块,这里面可能用到了网络请求叫request.py,

    还有文件操作fileopt.py 那就应该将它定义为包,因为这两个文件中的功能都是给别人调用的!

    ==总结:项目标准结构第一层仅仅是文件夹绝不是包!==

    二.定制程序的入口

    继续完善程序,四期可以展示用户功能界面 在src中定义run函数,用来启动程序,注意src所在的core中可

    能有多个文件,用户在使用时不方便,所以我们程序的入口从src中转移到start.py中

    在start.py中导入core下的src并执行run

    #file:"start.py"
    impiory core.src
    cor.src.run()

    由于core这个模块并不存在于环境中,所以程序无法运行!

    所以第一步:在环境变量中添加core

    #file:"start.py"
    import sys
    sys.path.append(r"C:\yyhpythonday20ATMcore")
    
    import core.src
    core.src.run()

    程序执行成功,但是以上写法存在两个问题.

    1.除了core,其他的lib,conf就无法使用

    为了能够找到所有模块,我们把ATM文件夹加入环境变量

    #file:"start.py"
    import sys
    sys.path.appenf(r"c:\yyhpythonday20ATM

    2.如果用户的安装路径不同,程序也无法运行

    此时我们需要动态的获取当前项目的目录

    在一个py文件中可以使用file来获取当前文件的路径

    可以通过当前文件路径来获取文件所在的目录 使用os.paht.dirname

    最终的代码如下:

    #file:"start.py"
    import sys,os
    BASE_DIR = os.path.dirname(os.path.dirname(__file__)))
    sys.path.append(BASE_DIR)
    import core.src
    core.src.run()

    三.使用标准目录后

    引用配置文件

    在上述案例中我们把文件的路径定义为变量并放在setting.py文件中

    那么在src中要使用这些变量 就需要导入conf下的setting.py

    由于在启动文件start.py中我们已经将项目根目录添加到path中,所以可以直接导入

    #file:"src.py"部分代码

    #导入配置文件

    from conf import setting
    
    def login():
    
      #加载文件 使用配置文件中的路径
    
      with open(setting.DB_PATH( as f:
    
        print(f.read())
    def register():
    
      print("注册"")

    引用自定义模块

    为上述案列添加日志功能

    #file:"src.py" 部分代码
    #日志功能
    def logger(msg):
    with open("/Users/jerry/PycharmProjects/项目结构/log/log.txt") as f:
    f.write(msg)
    #导入配置
    from conf import setting
    def login():
    #导入配置文件
    with open(setting.DB_PATH) as f:
    print(f.read())
    logger("xxx登录系统")
    def register():
    print("注册")

    日志功能并不是只有src文件使用 所以我们将它提取为单独的模块

    在lib下comon中

    #file:"src.py"部分代码
    # 导入配置文件获取 日志路径
    from conf import setting
    #日志功能
    def logger(msg)
        with open(setting.LOG_PATH) as f:
            f.write(msg)

    在src中导入日志模块

    #file:"src.py" 部分代码
    from lib import common
    #日志功能
    def logger(msg):
    with open("/Users/jerry/PycharmProjects/项目结构/log/log.txt") as f:
    f.write(msg)
    #导入配置文件
    from conf import setting
    def login():
    #加载文件 使用配置文件中的路径
    with open(setting.DB_PATH) as f:
    print(f.read())
    logger("xxx登录系统")
    def register():
    print("注册")
  • 相关阅读:
    hbase分布式集群搭建
    hadoop分布式集群搭建
    cobbler koan自动重装系统
    nginx基础整理
    cobbler 自定义安装系统
    cobbler 自定义私有yum源
    cobbler自动安装系统
    [转]10+倍性能提升全过程--优酷账号绑定淘宝账号的TPS从500到5400的优化历程
    服务器性能调优(netstat监控大量ESTABLISHED连接与Time_Wait连接问题)
    LINUX下解决netstat查看TIME_WAIT状态过多问题
  • 原文地址:https://www.cnblogs.com/gongcheng-/p/9792022.html
Copyright © 2011-2022 走看看