当配置信息的数量变多,若是全部放在app.py文件中就会显得代码太乱,可读性差,为此,Flask提供了一个config对象来接收多种配置格式,方便管理配置文件信息。
config对象的方法:
方法 | 描述 |
---|---|
from_object | 从类当中导入配置,需要编写配置类 |
from_envvar | 从沙箱环境当中导入 |
from_json | 从json文件当中导入 |
from_mapping | 从字典对象当中导入配置 |
from_pyfile | 从python文件当中导入 |
# config.py
import os
base_dir = os.path.dirname(
os.path.abspath(__file__)
) # 指定文件存放的目录
class BaseConfig:
"""基本类"""
SQLALCHEMY_TRACK_MODIFICATIONS = True # 支持追踪修改
class TestConfig(BaseConfig):
"""开发测试类"""
# 设置项目开发时的数据库配置
SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(base_dir, "OA_test.sqlite")
debug = True
class WorkConfig(BaseConfig):
"""项目部署类"""
# 项目部署在服务器运行时的数据库配置
SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(base_dir, "OA_work.sqlite")
debug = True
# app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import TestConfig, WorkConfig
from flask import render_template
app = Flask(__name__) # 实例化应用
app.config.from_object(TestConfig) # config从类中导入配置
db = SQLAlchemy(app) # flask加载数据库
class Base(db.Model):
__abstract__ = True # 作为父类完成被继承,本身不执行
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
def save(self):
db.session.add(self)
db.session.commit()
def delete(self):
db.session.delete(self)
db.session.commit()
def update(self):
db.session.commit()
class Person(Base):
"""员工类"""
username = db.Column(db.String(32), unique=True) # 用户名不能重复
age = db.Column(db.Integer, default=18) # 年龄默认十八岁
gender = db.Column(db.String(16))
@app.route("/")
def index(user):
user = Person.query.get(1) # 获取id为1的用户
return render_template("index.html", **locals())
if __name__ == '__main__':
db.create_all()
app.run(debug=True, use_reloader=True)
当项目规模扩大时,就需要一个更加稳定,并且统一的项目结构,因此,官方推出了蓝图模式。蓝图模式把功能和app区分开来,实现了在一个项目当中设置多个视图,多个模型。
文件目录
# main.py
from flask import Flask
from Blue_one import bule_one
from Blue_two import blue_two
application = Flask(__name__) # 实例化应用
application.register_blueprint(bule_one, url_prefix="/one") # 应用安装蓝图
application.register_blueprint(blue_two, url_prefix="/two") # url_prefix设置路由前添加字段/two***
if __name__ == '__main__':
application.run() # 蓝图运行
# Blue_one/__init__.py
"""
创建蓝图一
"""
from flask import Blueprint
# 实例化蓝图
bule_one = Blueprint("bule_one", __name__)
from Blue_one.view import * # 导入所有的视图,让视图运行
# view.py
"""
蓝图一的视图
"""
from Blue_one import bule_one
@bule_one.route("/index/")
def index():
return "blue_one"
上述的blue_one和blue_two相当于两个app,每一个app各自负责自己的业务逻辑,例如电商项目中的买家页面和买家页面。
在Linux系统下,操作项目需要用到命令,因此有了Flask-script。
包的安装
pip install flask-script
编写启动项目的命令
from flask import Flask # 导入
from flask_script import Command, Manager # 导入命令行管理工具
app = Flask(__name__) # 创建http实例
@app.route("/index/")
def index():
return "创建命令"
class Run(Command): # 编写命令类
def run(self): # 要执行的功能必须写在run函数中,run函数是command提供的重写函数
app.run(debug=True, use_reloader=True)
manage = Manager(app) # 命令行绑定应用
manage.add_command("run", Run) # 安装命令
if __name__ == '__main__':
manage.run() # 启动命令行
在命令行中切换到相应的目录下执行下面命令启动项目
python main.py run
设置命令行启动后,在pycharm中直接点击运行并不能启动项目,这样一来就不能使用断点功能了,为了解决这个问题,需要相应的配置。
db.create_all()只可以创建数据库,不能进行数据库的修改,开发中时常要对模型进行修改,添加字段,仅仅是创建并不能满足开发需求,因此有了Flask-migrate。
包的安装
pip install flask-migrate
编写启动项目的命令
from flask import Flask # 导入
from flask_script import Command, Manager # 导入命令行管理工具
from flask_migrate import Migrate, MigrateCommand
from OAP.OAprint.models import db
app = Flask(__name__) # 创建http实例
@app.route("/index/")
def index():
return "创建命令"
class Run(Command): # 编写命令类
def run(self): # 要执行的功能必须写在run函数中,run函数是command提供的重写函数
app.run(debug=True, use_reloader=True)
manage = Manager(app) # 命令行绑定应用
migrate = Migrate(app, db) # 绑定应用和数据库
manage.add_command("db", MigrateCommand) # 安装命令
manage.add_command("run", Run) # 安装命令
if __name__ == '__main__':
manage.run() # 启动命令行
在命令行中输入命令即可操作数据库
初始化数据库,形成数据库记录文件
python main.py db init
数据库同步
python main.py db migrate
更新数据库
python main.py db upgrade
修改数据库的操作:先同步再更新数据库