day20_步入百萬年薪的第二十天——規範化目錄

day20

為什麼要有規範化目錄

  1. 可讀性高: 不熟悉這個項目的代碼的人,一眼就能看懂目錄結構,知道程序啟動腳本是哪個,測試目錄在哪兒,配置文件在哪兒等等。從而非常快速的了解這個項目。
  2. 可維護性高: 定義好組織規則后,維護者就能很明確地知道,新增的哪個文件和代碼應該放在什麼目錄之下。這個好處是,隨着時間的推移,代碼/配置的規模增加,項目結構不會混亂,仍然能夠組織良好。

變量:靜態路徑。變量

代碼分類:

​ 加載快

​ 可讀性高

​ 查詢修改都簡單

分析規範化目錄

所有文件都在blog文件夾下

《day20_步入百萬年薪的第二十天——規範化目錄》

1、start.py 文件

​ 在bin文件夾下

​ 項目啟動文件。你的項目需要有專門的文件啟動,而不是在你的核心邏輯部分進行啟動的,有人對這個可能不太理解,我為什麼還要設置一個單獨的啟動文件呢?你看你生活中使用的所有電器基本都一個單獨的啟動按鈕,汽車,熱水器,電視,等等等等,那麼為什麼他們會單獨設置一個啟動按鈕,而不是在一堆線路板或者內部隨便找一個地方開啟呢? 目的就是放在顯眼的位置,方便開啟。你想想你的項目這麼多py文件,如果src文件也有很多,那麼到底哪個文件啟動整個項目,你還得一個一個去尋找,太麻煩了,這樣我把它單獨拿出來,就是方便開啟整個項目。

import sys
import os
# sys.path.append(r'D:\lnh.python\py project\teaching_show\blog')
# print(os.path.dirname(__file__))
# 獲取本文件的絕對路徑  # D:/lnh.python/py project/teaching_show/blog/bin
# print(os.path.dirname(os.path.dirname(__file__)))
# 獲取父級目錄也就是blog的絕對路徑  # D:/lnh.python/py project/teaching_show/blog
BATH_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BATH_DIR)
from core.src import run

if __name__ == '__main__':
    run()
2、settings.py文件

​ 在conf文件夾下

​ 配置文件,就是放置一些項目中需要的靜態參數,比如文件路徑數據庫配置軟件的默認設置等等

3、src.py 主邏輯核心邏輯文件

​ 在core文件夾下

​ 這個文件主要存放的就是核心邏輯功能,你看你需要進行選擇的這些核心功能函數,都應該放在這個文件中。

4、類似於register文件

​ 在db文件夾下

​ 用戶信息,數據相關,多個文件,這個文件文件名不固定,register只是我們項目中用到的註冊表,但是這種文件就是存儲數據的文件,類似於文本數據庫,那麼我們一些項目中的數據有的是從數據庫中獲取的,有些數據就是這種文本數據庫中獲取的,總之,你的項目中有時會遇到將一些數據存儲在文件中,與程序交互的情況,所以我們要單獨設置這樣的文件。

5、common.py 公共組件部分

​ 在lib文件夾下

​ 公共組件文件,這裏面放置一些我們常用的公共組件函數,並不是我們核心邏輯的函數,而更像是服務於整個程序中的公用的插件,程序中需要即調用。比如我們程序中的裝飾器auth,有些函數是需要這個裝飾器認證的,但是有一些是不需要這個裝飾器認證的,它既是何處需要何處調用即可。比如還有密碼加密功能序列化功能日誌功能等這些功能都可以放在這裏。

6、logging日誌文件——access.log

​ 在log文件夾下

​ 記錄用戶的訪問次數,轉賬,取錢,充錢等等,log文件顧名思義就是存儲log日誌的文件。日誌我們一會就會講到,日誌主要是供開發人員使用。比如你項目中出現一些bug問題,比如開發人員對服務器做的一些操作都會記錄到日誌中,以便開發者瀏覽,查詢。

7、README

這個我覺得是每個項目都應該有的一個文件,目的是能簡要描述該項目的信息,讓讀者快速了解這個項目。

它需要說明以下幾個事項:

  1. 軟件定位,軟件的基本功能。
  2. 運行代碼的方法: 安裝環境、啟動命令等。
  3. 簡要的使用說明。
  4. 代碼目錄結構說明,更詳細點可以說明軟件的基本原理。
  5. 常見問題說明。

我覺得有以上幾點是比較好的一個README。在軟件開發初期,由於開發過程中以上內容可能不明確或者發生變化,並不是一定要在一開始就將所有信息都補全。但是在項目完結的時候,是需要撰寫這樣的一個文檔的。

可以參考Redis源碼中Readme的寫法,這裏面簡潔但是清晰的描述了Redis功能和源碼結構。

博客園代碼演示

原代碼

status_dic = {
    'username': None,
    'status': False,
}
flag = True

REGISTER_PATH = r'F:\s24\day20\register'

def login():
    i = 0
    with open(REGISTER_PATH, encoding='utf-8') as f1:
        dic = {i.strip().split('|')[0]: i.strip().split('|')[1] for i in f1}
    while i < 3:
        username = input('請輸入用戶名:').strip()
        password = input('請輸入密碼:').strip()
        if username in dic and dic[username] == password:
            print('登錄成功')
            status_dic['username'] = username
            status_dic['status'] = True
            return True
        else:
            print('用戶名密碼錯誤,請重新登錄')
            i += 1


def register():
    with open(REGISTER_PATH, encoding='utf-8') as f1:
        dic = {i.strip().split('|')[0]: i.strip().split('|')[1] for i in f1}
    while 1:
        print('\033[1;45m 歡迎來到註冊頁面 \033[0m')
        username = input('請輸入用戶名:').strip()
        if not username.isalnum():
            print('\033[1;31;0m 用戶名有非法字符,請重新輸入 \033[0m')
            continue
        if username in dic:
            print('\033[1;31;0m 用戶名已經存在,請重新輸入 \033[0m')
            continue
        password = input('請輸入密碼:').strip()
        if 6 <= len(password) <= 14:
            with open(REGISTER_PATH, encoding='utf-8', mode='a') as f1:
                f1.write(f'\n{username}|{password}')
            status_dic['username'] = str(username)
            status_dic['status'] = True
            print('\033[1;32;0m 恭喜您,註冊成功!已幫您成功登錄~ \033[0m')
            return True
        else:
            print('\033[1;31;0m 密碼長度超出範圍,請重新輸入 \033[0m')


def auth(func):
    def inner(*args, **kwargs):
        if status_dic['status']:
            ret = func(*args, **kwargs)
            return ret
        else:
            print('\033[1;31;0m 請先進行登錄 \033[0m')
            if login():
                ret = func(*args, **kwargs)
                return ret

    return inner


@auth
def article():
    print(f'\033[1;32;0m 歡迎{status_dic["username"]}訪問文章頁面\033[0m')


@auth
def diary():
    print(f'\033[1;32;0m 歡迎{status_dic["username"]}訪問日記頁面\033[0m')


@auth
def comment():
    print(f'\033[1;32;0m 歡迎{status_dic["username"]}訪問評論頁面\033[0m')


@auth
def enshrine():
    print(f'\033[1;32;0m 歡迎{status_dic["username"]}訪問收藏頁面\033[0m')


def login_out():
    status_dic['username'] = None
    status_dic['status'] = False
    print('\033[1;32;0m 註銷成功 \033[0m')


def exit_program():
    global flag
    flag = False
    return flag


choice_dict = {
    1: login,
    2: register,
    3: article,
    4: diary,
    5: comment,
    6: enshrine,
    7: login_out,
    8: exit_program,
}
def run():
    while flag:
        print('''
        歡迎來到博客園首頁
        1:請登錄
        2:請註冊
        3:文章頁面
        4:日記頁面
        5:評論頁面
        6:收藏頁面
        7:註銷
        8:退出程序''')

        choice = input('請輸入您選擇的序號:').strip()
        if choice.isdigit():
            choice = int(choice)
            if 0 < choice <= len(choice_dict):
                choice_dict[choice]()
            else:
                print('\033[1;31;0m 您輸入的超出範圍,請重新輸入 \033[0m')

        else:
            print('\033[1;31;0m 您您輸入的選項有非法字符,請重新輸入 \033[0m')

規範化目錄

blog

bin-starts.py
# run() # 找不到名字
# 找到src.py文件的run名字

# from src import run
# run()
# sys.path 到底是什麼?

# import time
# import t1
# import sys
# t1.func()
'''
sys模塊內置模塊,文件運行時,sys內置模塊就會將一些模塊 自動  加載到內存. 內置模塊. time,json pickle等等.以及當前目錄的.
如何引用到一個模塊最本質的原因在於這個模塊名稱空間在不在內存.
如果直接引用不到一個模塊,他必定不是內置或者當前目錄下的py文件.
所以,我們要手動將其添加到內存. 
sys.path.append()就是手動的將一些模塊添加到內存,添加完畢之後,就可以直接引用了.
'''
# import sys
# # 版本二: 繁瑣,我要將整個項目作為根目錄,添加到內存中.
# sys.path.append(r'F:\s24\day20\模擬博客園代碼\blog\core')
# sys.path.append(r'F:\s24\day20\模擬博客園代碼\blog\conf')
# sys.path.append(r'F:\s24\day20\模擬博客園代碼\blog\db')
# from src import run
# run()


# 版本三: 你把項目路徑寫死了,所有的開發人員如果共同開發這個項目,必須都得按照這個目錄結構去構建.
# import sys
# sys.path.append(r'F:\s24\day20\模擬博客園代碼\blog')
# from core.src import run
# run()


# 版本四:
import sys
import os

# print(__file__)
# print(os.path.dirname(os.path.dirname(__file__)))
# sys.path.append(r'F:\s24\day20\模擬博客園代碼\blog')
# from core.src import run
# run()

BASE_PATH = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_PATH)
from core.src import run
if __name__ == '__main__':

    run()
conf-settings.py
import sys
import os
BASE_PATH = os.path.dirname(os.path.dirname(__file__))
REGISTER_PATH = os.path.join(BASE_PATH, 'db', 'register')
core-src.py
from conf import settings
from lib import common
status_dic = {
    'username': None,
    'status': False,
}
flag = True

def login():
    i = 0
    with open(settings.REGISTER_PATH, encoding='utf-8') as f1:
        dic = {i.strip().split('|')[0]: i.strip().split('|')[1] for i in f1}
    while i < 3:
        username = input('請輸入用戶名:').strip()
        password = input('請輸入密碼:').strip()
        if username in dic and dic[username] == password:
            print('登錄成功')
            status_dic['username'] = username
            status_dic['status'] = True
            return True
        else:
            print('用戶名密碼錯誤,請重新登錄')
            i += 1


def register():
    with open(settings.REGISTER_PATH, encoding='utf-8') as f1:
        dic = {i.strip().split('|')[0]: i.strip().split('|')[1] for i in f1}
    while 1:
        print('\033[1;45m 歡迎來到註冊頁面 \033[0m')
        username = input('請輸入用戶名:').strip()
        if not username.isalnum():
            print('\033[1;31;0m 用戶名有非法字符,請重新輸入 \033[0m')
            continue
        if username in dic:
            print('\033[1;31;0m 用戶名已經存在,請重新輸入 \033[0m')
            continue
        password = input('請輸入密碼:').strip()
        if 6 <= len(password) <= 14:
            with open(settings.REGISTER_PATH, encoding='utf-8', mode='a') as f1:
                f1.write(f'\n{username}|{password}')
            status_dic['username'] = str(username)
            status_dic['status'] = True
            print('\033[1;32;0m 恭喜您,註冊成功!已幫您成功登錄~ \033[0m')
            return True
        else:
            print('\033[1;31;0m 密碼長度超出範圍,請重新輸入 \033[0m')


@common.auth
def article():
    print(f'\033[1;32;0m 歡迎{status_dic["username"]}訪問文章頁面\033[0m')


@common.auth
def diary():
    print(f'\033[1;32;0m 歡迎{status_dic["username"]}訪問日記頁面\033[0m')


@common.auth
def comment():
    print(f'\033[1;32;0m 歡迎{status_dic["username"]}訪問評論頁面\033[0m')


@common.auth
def enshrine():
    print(f'\033[1;32;0m 歡迎{status_dic["username"]}訪問收藏頁面\033[0m')


def login_out():
    status_dic['username'] = None
    status_dic['status'] = False
    print('\033[1;32;0m 註銷成功 \033[0m')


def exit_program():
    global flag
    flag = False
    return flag


choice_dict = {
    1: login,
    2: register,
    3: article,
    4: diary,
    5: comment,
    6: enshrine,
    7: login_out,
    8: exit_program,
}
def run():
    while flag:
        print('''
        歡迎來到博客園首頁
        1:請登錄
        2:請註冊
        3:文章頁面
        4:日記頁面
        5:評論頁面
        6:收藏頁面
        7:註銷
        8:退出程序''')

        choice = input('請輸入您選擇的序號:').strip()
        if choice.isdigit():
            choice = int(choice)
            if 0 < choice <= len(choice_dict):
                choice_dict[choice]()
            else:
                print('\033[1;31;0m 您輸入的超出範圍,請重新輸入 \033[0m')

        else:
            print('\033[1;31;0m 您您輸入的選項有非法字符,請重新輸入 \033[0m')
db-register
liye|liyedsb
meet|baoyuandsb
log-access.log
README
說明書
点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *