Flask大型项目框架结构理解

  导语:前段时间学习狗书的flask大型项目框架结构的时候有点混乱,到如今也知道是个啥了,想着,把关系理一理,写一篇博客。也方便后来学习的人查阅。如下是我建立项目时候的结构。python

   

  myprojectshell

     ---->app                 项目文件夹数据库

       ---->static         静态资源flask

       ---->templates          网页模板app

       ---->main          项目主文件文件夹框架

         ---->__init__.py  项目主文件初始化    学习

         ---->views.py   项目视图测试

           ---->errors.py   项目错误网页视图url

           ---->forms.py          项目表单文件spa

        ---->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()
相关文章
相关标签/搜索