Flask项目结构化---使用蓝图

501 阅读2分钟

Flask是一个使用 Python 编写的轻量级 Web 应用框架。

Flask中的蓝图旨在针对这些情况:

  • 把一个应用分解成一系列的蓝图。对于大型的应用是理想化的;一个项目能实例化一个应用, 初始化一些扩展,以及注册一系列的蓝图。
  • 以一个 URL 前缀和/或子域在一个应用上注册蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
  • 在一个应用中用不同的 URL 规则多次注册一个蓝图。
  • 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或视图函数。
  • 初始化一个 Flask 扩展时,在这些情况中注册蓝图。

项目结构图

配置文件 config.py

import os

class Config:
    DEBUG = False  # debug模式关闭
    SQLALCHEMY_DATABASE_URI = "sqlite:Project/FlaskProject/CompanyProject/flask.db"  # 数据库文件存放位置
    SQLALCHEMY_TRACK_MODIFICATIONS = True  # 数据库改变后自动更新
    SECRET_KEY = os.environ.get("SECRET_KEY") or "hard to guess string"  # 获取环境变量作为密钥
    
    @staticmethod
    def init_app(app):
        pass

class Test(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = "sqlite:Project/FlaskProject/CompanyProject/flask.db"
    
class Run(Config):
    DEBUG = False

config = {
    "test":Test,
    "run":Run    
}

初始化文件 app/__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import config

db = SQLAlchemy()  # 实例化数据库

# 创建app
def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])  
    config[config_name].init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)
    db.init_app(app)

    return app

引入蓝图 app/main/__init__.py

from flask import Blueprint

main = Blueprint("main",__name__)

from . import views,errors

 视图编写 app/main/views.py

from . import main

@main.route("/")
def index():
    return "hello world"

数据库模型 app/models.py

from app import db

class User(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(32))

class Type(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    label = db.Column(db.String(32))

 启动脚本 manage.py

import os
from app import create_app,db
from app.models import User,Type
from flask_script import Manager,Shell
from flask_migrate import MigrateCommand,Migrate

app = create_app(os.getenv("FLASK_CONFIG") or "test")

manager = Manager(app)
migrate = Migrate(app,db)

def make_shell_context():
    return dict(app = app, db = db, User = User ,Type =Type)

def create_db():
    db.create_all()

manager.add_command("shell",Shell(make_context=make_shell_context))
manager.add_command("db",MigrateCommand)

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

执行命令:

1、python manage.py runserver 启动服务

2、Python manage.py db init 实例化数据库

3、Python manage.py db migrate -m "initial migration" 生成数据库语句

4、Python manage.py db upgrade 同步数据库

5、Python manage.py shell 交互命令

 启动带有Flask环境的Python交互式解释器,也就是命令行环境。