Flask大型項目框架結構理解


  導語:前段時間學習狗書的flask大型項目框架結構的時候有點混亂,到現在也知道是個啥了,想着,把關系理一理,寫一篇博客。也方便后來學習的人查閱。以下是我創建項目時候的結構。

   

  myproject

     ---->app                 項目文件夾

       ---->static         靜態資源

       ---->templates          網頁模板

       ---->main          項目主文件文件夾

         ---->__init__.py  項目主文件初始化    

         ---->views.py   項目視圖

           ---->errors.py   項目錯誤網頁視圖

           ---->forms.py          項目表單文件

        ---->models       項目數據庫

       ---->emails    項目郵箱

       ---->__init__.py      項目初始化信息

     ---->config.py    項目配置文件

     ---->manage.py    項目管理文件     

 

  根據自己喜好可以自由配置。首先在數據庫中,我們可以配置3個config文件,分別用於開發,測試和上線,然后把這三個轉化為字典結構,便於調用。如下    

config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}

 

配置信息寫好之后,便開始開發了。由於結構的問題,使得我們需要使用藍圖來進行開發。我們在app/main/__init__中,寫如下代碼 

from flask import Blueprint

main = Blueprint(“main”,__name__#"main" 為這個藍圖的名字

from . import view,error   #導入需要用到藍圖的兩個文件

 

創建好了藍圖之后,我們還需要在app/__init__中完成對藍圖的注冊,代碼如下:

from app.main import main as main_blueprint

app.register_blueprint(main_blueprint)

 

看到app,是不是有人就很好奇了,這個app是怎么來的啊,其實就跟我們以前寫的一樣,狗書上用工廠模式在這個__init__中,不僅用於注冊,還用於調用配置信息和初始化第三方擴展。完整代碼如下:

from flask import Flask, render_template
from flask.ext.mail import Mail


mail = Mail()

def create_app(config_name):
    app = Flask(__name__)  #初始化flask
    app.config.from_object(config[config_name]) #config_name就是配置信息的那個字典
    
    config[config_name].init_app(app)  調用配置信息的初始化環境的靜態方法
    
    mail.init_app(app)  第三方擴展初始化

  #這里寫的是上方的代碼,用於藍圖注冊

    return app

 

創建好了藍圖之后怎么用呢?在app/main/views中,我們創建路由是這樣,代碼如下:

@main.route("/")
def index():
    return redirect(url_for("main.路由名字"))

 

上面的代碼寫好了之后,我們需要的就是運行了,為此在manage.py中代碼如下:

import os
from app import create_app, db
from app.models import User, Role  #導入數據庫的兩個模型
from flask.ext.script import Manager, Shell   #導入flask_script 
from flask.ext.migrate import Migrate, MigrateCommand  #導入flask_migrate  

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, Role=Role)
    manager.add_command("shell",         #避免重復導入數據庫模型
    Shell(make_context=make_shell_context))
    manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM