包(Package)
當(dāng)你的模塊文件越來越多,就需要對(duì)模塊文件進(jìn)行劃分,比如把負(fù)責(zé)跟數(shù)據(jù)庫交互的都放一個(gè)文件夾,把與頁面交互相關(guān)的放一個(gè)文件夾,
my_proj/
├── apeland_web? #代碼目錄
│? ├── __init__.py
│? ├── admin.py
│? ├── apps.py
│? ├── models.py
│? ├── tests.py
│? └── views.py
├── manage.py
└── my_proj? ? #配置文件目錄
? ? ├── __init__.py
? ? ├── settings.py
? ? ├── urls.py
? ? └── wsgi.py
像上面這樣,一個(gè)文件夾管理多個(gè)模塊文件,這個(gè)文件夾就被稱為包
一個(gè)包就是一個(gè)文件夾,但該文件夾下必須存在?init.py 文件, 該文件的內(nèi)容可以為空,?int.py用于標(biāo)識(shí)當(dāng)前文件夾是一個(gè)包。
這個(gè)init.py的文件主要是用來對(duì)包進(jìn)行一些初始化的,當(dāng)當(dāng)前這個(gè)package被別的程序調(diào)用時(shí),init.py文件會(huì)先執(zhí)行,一般為空, 一些你希望只要package被調(diào)用就立刻執(zhí)行的代碼可以放在init.py里,一會(huì)后面會(huì)演示。
跨模塊導(dǎo)入
目錄結(jié)構(gòu)如下
my_proj
├── apeland_web
│? ├── __init__.py
│? ├── admin.py
│? ├── apps.py
│? ├── models.py
│? ├── tests.py
│? └── views.py
├── manage.py
└── my_proj
? ? ├── settings.py
? ? ├── urls.py
? ? └── wsgi.py
根據(jù)上面的結(jié)構(gòu),如何實(shí)現(xiàn)在apelandweb/views.py里導(dǎo)入myproj/settings.py模塊?
直接導(dǎo)入的話,會(huì)報(bào)錯(cuò),說找到不模塊

是因?yàn)槁窂秸也坏剑琺y_proj/settings.py 相當(dāng)于是apeland_web/views.py的父親(apeland_web)的兄弟(my_proj)的兒子(settings.py),settings.py算是views.py的表弟啦,在views.py里只能導(dǎo)入同級(jí)別兄弟模塊代碼,或者子級(jí)別包里的模塊,根本不知道表弟表哥的存在。這可怎么辦呢?
答案是添加環(huán)境變量,把父親級(jí)的路徑添加到sys.path中,就可以了,這樣導(dǎo)入 就相當(dāng)于從父親級(jí)開始找模塊了。
apeland_web/views.py中添加環(huán)境變量
import sys ,os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印當(dāng)前被執(zhí)行的模塊.py文件相對(duì)路徑,注意是相對(duì)路徑
print(BASE_DIR) # 輸出是/Users/alex/PycharmProjects/apeland_py_learn/day4_常用模塊/my_proj
sys.path.append(BASE_DIR)
from? my_proj import settings
print(settings.DATABASES)
官方推薦的跨目錄導(dǎo)入方法
雖然通過添加環(huán)境變量的方式可以實(shí)現(xiàn)跨模塊導(dǎo)入,但是官方不推薦這么干,因?yàn)檫@樣就需要在每個(gè)目錄下的每個(gè)程序里都寫一遍添加環(huán)境變量的代碼。
官方推薦的玩法是,在項(xiàng)目里創(chuàng)建個(gè)入口程序,整個(gè)程序調(diào)用的開始應(yīng)該是從入口程序發(fā)起,這個(gè)入口程序一般放在項(xiàng)目的頂級(jí)目錄
這樣做的好處是,項(xiàng)目中的二級(jí)目錄 apeland_web/views.py中再調(diào)用他表親my_proj/settings.py時(shí)就不用再添加環(huán)境變量了。
原因是由于manage.py在頂層,manage.py啟動(dòng)時(shí)項(xiàng)目的環(huán)境變量路徑就會(huì)自動(dòng)變成….xxx/my_proj/這一級(jí)別
