Skip to content

项目配置

编写配置文件

在编写项目的时候,一般会运行在多种环境下,为此最好是将配置文件进行统一,比较好的方式是实用类进行继承然后区分,创建对象是根据传递的参数再决定使用什么配置文件。

python

import os


class BaseConfig:
    SECRET_KEY = os.getenv('SECRET_KEY', 'pear-admin-flask')

    SQLALCHEMY_DATABASE_URI = ""


class DevelopmentConfig(BaseConfig):
    """开发配置"""
    SQLALCHEMY_DATABASE_URI = "sqlite:///pear_admin.db"
    SQLALCHEMY_TRACK_MODIFICATIONS = False


class TestingConfig(BaseConfig):
    """测试配置"""
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'  # 内存数据库


class ProductionConfig(BaseConfig):
    """生成环境配置"""
    SQLALCHEMY_DATABASE_URI = "mysql://root:root@127.0.0.1:3306/pear_admin"
    SQLALCHEMY_TRACK_MODIFICATIONS = False


config = {
    'dev': DevelopmentConfig,
    'test': TestingConfig,
    'prod': ProductionConfig
}

然后在 pear_admin/__init__.py 中添加配置

python
from flask import Flask
from configs import config  # 导入配置文件


def create_app(config_name='dev'):
    app = Flask("pear-admin-flask")

    app.config.from_object(config[config_name])  # 加载配置文件

    @app.route("/")
    def index():
        return "hello pear-admin-flask !"

    return app

配置插件

首先安装一下需要使用到的插件

shell
poetry add flask-sqlalchemy
poetry add flask-migrate

然后初始化数据库插件

python
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
migrate = Migrate()

然后封装到拓展插件目录

python
from flask import Flask

from .init_db import db, migrate


def register_extensions(app: Flask):
    db.init_app(app)
    migrate.init_app(app, db)

然后在 app 中配置

python
from flask import Flask
from configs import config
from pear_admin.extensions import register_extensions  #


def create_app(config_name='dev'):
    app = Flask("pear-admin-flask")

    app.config.from_object(config[config_name])

    register_extensions(app)  #

    @app.route("/")
    def index():
        return "hello pear-admin-flask !"

    return app

模块化蓝图

在做项目时,一般会将蓝图根据功能业务进行拆分。

新建 pear_admin/views 目录,然后在其中添加 index.py 文件

python
from flask import Blueprint

index_bp = Blueprint('index', __name__)


@index_bp.route("/")
def index():
    return "hello pear-admin-flask !"

然后在 __init__.py 中添加以下内容

python
from flask import Blueprint

index_bp = Blueprint('index', __name__)


@index_bp.route("/")
def index():
    return "hello pear-admin-flask !"

最后修改 app 引入蓝图的方式

python
from flask import Flask

from configs import config
from pear_admin.extensions import register_extensions
from pear_admin.orms import UserORM
from pear_admin.views import register_views  // [!code ++]


def create_app(config_name="dev"):
    app = Flask("pear-admin-flask")

    app.config.from_object(config[config_name])

    register_extensions(app)

    @app.route("/")
    def index():     // [!code --]
        return "hello pear-admin-flask !"  // [!code --]

    register_views(app)  // [!code ++]

    return app

运行程序之后可以发现与之前保持一致。

初始化 api 接口

项目的分为接口层与视图层。请求返回 HTML 的路由全部走接口层,返回的是 json 数据的全部走接口层(apis)

新建 pear_admin/apis 目录,在目录下先封装 passport.py 蓝图接口

python
from flask import Blueprint

passport_bp = Blueprint('passport', __name__)


@passport_bp.post('/test')
def test_in():
    return {'message': '测试成功', 'code': 0}

目前还没有获取的前端的请求内容,先给一个接口占位。

然后封装 __init__.py 文件

python
from flask import Flask, Blueprint

from .passport import passport_api


def register_apis(app: Flask):
    apis = Blueprint('api', __name__, url_prefix='/api/v1')

    apis.register_blueprint(passport_api)

    app.register_blueprint(apis)

然后在 app 对象中注册一下

python
from flask import Flask

from configs import config
from pear_admin.extensions import register_extensions
from pear_admin.orms import UserORM
from pear_admin.views import register_views
from pear_admin.apis import register_apis // [!code ++]


def create_app(config_name="dev"):
    app = Flask("pear-admin-flask")

    app.config.from_object(config[config_name])

    register_extensions(app)
    register_apis(app) // [!code ++]

    register_views(app)

    return app

运行 flask routes 就可以看到显示出来的内容。

shell
D:\pear-admin-flask> flask routes
Endpoint               Methods  Rule                     
---------------------  -------  -------------------------
api.passport.login_in  POST     /api/v1/login  // [!code ++]
index.analysis         GET      /view/analysis/index.html
index.console1         GET      /view/console/index.html
index.index            GET      /
index.login            GET      /login.html
index.register         GET      /register.html
static                 GET      /static/<path:filename>

后续所有的接口全部写在 apis 目录之下。