导语:前段时间学习狗书的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()