FlaskDay06

蓝图 | 项目初建

目录

蓝图

我曾经想过用一片文章去介绍蓝图,但是反而越讲越复杂。我对于蓝图的理解就是认为蓝图所起的作用就是“分而治之”,它是 Flask 程序的模块化处理机制。一个大型的应用不可能再像之前我们这样,只是几个视图函数在以一个 app.py 中,而是有成千上百个路由则对应着成千上百的视图函数,蓝图的作用就是可以将众多的视图函数按照一定的规则进行切割,方便后期维护。

而对于蓝图的使用方法及其逻辑两步即可说完:

  1. 创建蓝图
  2. 注册蓝图

在第二步加粗的原因是,很多初学者创建蓝图就完事了,但是并没有和自己的项目创建关联,从而一 Debug 就 404 NOT FOUND 。具体不再细说,下面几篇文章对于蓝图的介绍与使用都是相当不错的,可以参考!

项目初建笔记

不提供参考,只是个人创建项目初期基本框架。

  1. 新建 Flask 项目
  2. 创建 settings.py
class Config:
DEBUG = True
# mysql+pymysql://user:password@hostip:port/database_name 配置数据库格式
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://tan:991013@106.52.206.43:3306/flaskday06'
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = True
class DevelopmentConfig(Config):
ENV = 'development'
class ProductionConfig(Config):
ENV = 'production'
DEBUG = True
  1. app.py 中进行修改
from flask import Flask
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from apps.user.models import User
from apps import create_app
from exts import db
app = create_app()
manager = Manager(app=app)
migrate = Migrate(app=app,db=db)
manager.add_command('db', MigrateCommand)
# 下面这句话可以打印出路由,方便在 模板文件中使用 url_for 确定名字,比如 user.register
print(app.url_map)
if __name__ == '__main__':
manager.run()
  1. 在主目录下构建包文件: apps,并在其自动生成的 _init_.py 文件中对上面的 create_app() 进行封装
from flask import Flask
from apps.user.view import user_bp
from exts import db
from settings import DevelopmentConfig
def create_app():
app = Flask(__name__,template_folder='../templates',static_folder='../static')
app.config.from_object(DevelopmentConfig)
# 初始化 db
db.init_app(app=app)
# 注册蓝图
app.register_blueprint(user_bp)
return app
  1. 在主目录下创建第三方扩展包 exts 包,在其 _init_.py 中创建 db 对象。并在 /apps/_init_.py 创建关联。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
  1. apps 包下创建 user 包,article 包;在 user 包下创建 view.py , models.py

  2. models.py 创建 User 类(即创建数据库表)并继承模型类;写完模型记得在 app.py 导入 User 类

from datetime import datetime
from exts import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
username = db.Column(db.String(15),nullable=False)
password = db.Column(db.String(64),nullable=False)
phone = db.Column(db.String(11),unique=True)
isdelete = db.Column(db.Boolean,default=False)
rdatetime = db.Column(db.DateTime,default=datetime.now)
def __str__(self):
return self.username
  1. 三个命令初始化创建表并进行迁移同步

    • python app.py db init | (整个项目进行一次就行(创建了一个 migration 文件夹))

    • python app.py db migrate | 生成版本文件

    • python app.py db upgrade | 迁移同步

      这样数据库就有刚才创建的 user 表。

  2. apps/user/view.py 创建蓝图并且进行蓝图注册

from flask import Blueprint, render_template, request, url_for, redirect
user_bp = Blueprint('user', __name__)
  1. 接下来就是自定义操作;另外在 templates 文件夹中也可以创建一个 user 文件夹,而相对于的模板文件可以放里面,这里就需要注意以后在试图函数引入模板文件的时候就要写 'user/xxx.html'

此时项目整体架构如下: