《Flask Web開發:基於Python的Web應用開發實戰》筆記(原創)
內容提要
在學習“狗書”《Flask Web開發:基於Python的Web應用開發實戰》的過程中,一直遇到各種各樣的坑。該書的第一部分是“Flask簡介”,主要介紹的一些基礎知識。第二部分是“例項:社交部落格程式”,講的是如何搭建一個社交部落格的框架。目前我學到第二部分,回過頭來看,覺得按照程式執行的實際邏輯來說明程式的原理,並在這個過程中分析遇到的各種“坑”,也更能讓人理解(至少讓我自己理解)。
正文
- 程式包結構
flask資料夾結構
其中:
app為程式包,Flask程式儲存在這個包中
migrations資料夾包含資料庫遷移指令碼
tests包儲存單元測試
requirements資料夾中記錄程式的依賴
config.py是程式的配置檔案
manage.py是程式的執行檔案,用於啟動程式即程式的其他任務
app包結構
其中:
auth為儲存專門用於認證的auth藍本
main為儲存main藍本的包
static資料夾用於儲存靜態檔案,例如HTML程式碼中引用的圖片、 JavaScript 原始碼檔案和 CSS
templates用於儲存網頁的模板
藍本資料夾結構(以auth資料夾為例,main藍本等不再贅述)
藍本的細節就不在此贅述,在flask框架中用到藍本,可以對不同的程式功能使用不同的藍本,這是保證程式整齊有序的辦法。(想想把所有功能都寫在一起會多麼混亂)。這裡說明一下到藍本的程式執行原理:app/auth/views.py 模組引入藍本,然後使用藍本的 route 修飾器定義與認證相關的路由,然後再渲染views中設定的網頁模板。看起來是不是如果程式能執行到藍本這一步,我們就可以對網頁進行操作了。
2. 執行說明
在執行程式的時候,我們在虛擬環境下,通過如下命令來完成。由此可見,程式的執行是由manage.py來開始的。
(venv) $ python manage.py runserver
那麼,我們來看看這個manage.py吧,期待不期待?興奮不興奮?
#!/usr/bin/env python import os COV = None if os.environ.get('FLASK_COVERAGE'): import coverage COV = coverage.coverage(branch=True, include='app/*') COV.start() if os.path.exists('.env'): print('Importing environment from .env...') for line in open('.env'): var = line.strip().split('=') if len(var) == 2: os.environ[var[0]] = var[1] from app import create_app, db from app.models import User, Follow, Role, Permission, Post, Comment from flask_script import Manager, Shell from flask_migrate import Migrate, MigrateCommand app = create_app(os.getenv('FLASK_CONFIG') or 'default') manager = Manager(app) migrate = Migrate(app, db) def make_shell_context(): return dict(app=app, db=db, User=User, Follow=Follow, Role=Role, Permission=Permission, Post=Post, Comment=Comment) manager.add_command("shell", Shell(make_context=make_shell_context)) manager.add_command('db', MigrateCommand) @manager.command def test(coverage=False): """Run the unit tests.""" if coverage and not os.environ.get('FLASK_COVERAGE'): import sys os.environ['FLASK_COVERAGE'] = '1' os.execvp(sys.executable, [sys.executable] + sys.argv) import unittest tests = unittest.TestLoader().discover('tests') unittest.TextTestRunner(verbosity=2).run(tests) if COV: COV.stop() COV.save() print('Coverage Summary:') COV.report() basedir = os.path.abspath(os.path.dirname(__file__)) covdir = os.path.join(basedir, 'tmp/coverage') COV.html_report(directory=covdir) print('HTML version: file://%s/index.html' % covdir) COV.erase() @manager.command def profile(length=25, profile_dir=None): """Start the application under the code profiler.""" from werkzeug.contrib.profiler import ProfilerMiddleware app.wsgi_app = ProfilerMiddleware(app.wsgi_app, restrictions=[length], profile_dir=profile_dir) app.run() @manager.command def deploy(): """Run deployment tasks.""" from flask_migrate import upgrade from app.models import Role, User # migrate database to latest revision upgrade() # create user roles Role.insert_roles() # create self-follows for all users User.add_self_follows() if __name__ == '__main__': manager.run()
下面我們按照順序去理一下,看看manage.py到底是如何執行的。
import os
COV = None
if os.environ.get('FLASK_COVERAGE'):
import coverage
COV = coverage.coverage(branch=True, include='app/*')
COV.start()