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