
以此結構為例,這個小項目是《Flask Web開發:基于python的web應用開發實戰》第一部分結束後的代碼架構
第一層
有app、tests、migrations三個檔案夾和config.py、manage.py兩個py檔案以及data-dev.sqlite、data-tests.sqlite兩個sqlite資料庫
app檔案夾下主要寫flask程式;
migrations 檔案夾包含資料庫遷移腳本;
tests檔案夾下編寫單元測試;
config.py用來存儲配置
manage.py 用于啟動程式以及其他的程式任務
data-dev.sqlite是程式運作時所用的資料庫
data-tests.sqlite是單元測試所使用的資料庫
app層
下面有main、static、templates三個檔案夾以及__init__.py、email.py、models.py三個py檔案
main檔案夾用來儲存藍本,此檔案夾下__inir__.py檔案裡面建立藍本,( 藍本和程式類似,也可以定義路由。不同的是,在藍本中定義的路由處于休眠狀态,直到藍本注冊到程式上後,路由才真正成為程式的一部分。)main檔案夾下views.py用來儲存程式的路由,errors.py用來處理錯誤,forms.py是存放表單定義
static存放靜态檔案
templates用來存放響應的html檔案,mail子檔案裡面的用來儲存發送郵件所需的.html和.txt檔案
__inir__.py檔案裡面包含create_app()函數,已經app的各種初始化
email.py包含send_email()發送檔案函數(異步)
models.py包含User和Role兩個表定義
tests層
test_basics.py用來編寫單元測試
應該還有一個venv檔案夾用來包含虛拟環境和一個requirements.txt 檔案,此檔案列出了所有依賴包,便于在其他電腦中重新生成相同的虛拟環境
個人需掌握
config.py中含有一個基類Config定義,三個繼承類定義DevlopmentConfig、TestingConfig、ProductionConfig和一個元組config
manage.py中含有app 建立,manage、migrate初始化,以及make_shell_context()函數在指令行擷取上下文,避免頻繁導入還有test()函數,用來測試。
app下__init__.py檔案含有create_app()函數,部分代碼有
bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()
def create_app(config_name): #建立app
app = Flask(__name__)
app.config.from_object(config[config_name]) #将配置類中的配置導入程式
config[config_name].init_app(app)
bootstrap.init_app(app)
mail.init_app(app)
moment.init_app(app)
db.init_app(app)
from .main import main as main_blueprint #導入藍本main
app.register_blueprint(main_blueprint) #在主程式中注冊藍本
return app
app.config.from_object(config[config_name]) 将配置類中的配置導入程式!!
在email中利用有這樣一行代碼
app = current_app._get_current_object()
current_app程式上下文!!!,了解有些模糊
在app/main/views下有一段代碼比較重要
@main.route('/',methods = ['POST','GET']) #請求方式不管是post還是get都執行這個視圖函數
def index():
form = NameForm() #表單執行個體
if form.validate_on_submit(): #送出按鈕是否成功點選
# 從資料庫中查找和表單資料一樣的資料,如果有,取第一個資料
user = User.query.filter_by(username = form.name.data).first()
if user is None: #如果資料庫中沒有對應的資料
user = User(username = form.name.data) #在資料庫中對應的表中建立資料
db.session.add(user) #加入到使用者會話,以便資料庫進行送出
session['known'] = False #這是一個新使用者
if current_app.config['FLASKY_ADMIN']: #如果收件人已經定義,則調用發送郵件函數
send_email(current_app.config['FLASKY_ADMIN'],'New User','mail/new_user',user = user)
flash('The mail has been sent out')
else:
session['known'] = True #這是一個老使用者
session['name'] = form.name.data #從表單擷取資料
return redirect(url_for('.index'))
return render_template('index.html',current_time = datetime.utcnow(),
form = form,name=session.get('name'),known