zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    JAVA基础知识之多线程——线程通信
    为Apache配置虚拟机Virtual Host
    SignalR的坑爹细节
    ashx入侵
    aspnet5安装ef7备忘
    aspnet5备忘
    NHibernate初步使用
    MVC中发生System.Data.Entity.Validation.DbEntityValidationException验证异常的解决方法
    关于NLog的target和Layout
    泛型约束的大概模样
  • 原文地址:https://www.cnblogs.com/haizhongdenta/p/8562883.html
Copyright © 2011-2022 走看看