1. 蓝图

Flask的蓝图(Blueprints)是一种组织Flask应用程序结构的方法,特别是当应用程序变得越来越大时。蓝图可以简单地理解为应用程序的子模块,它可以具有自己的视图、静态文件、模板等。

from flask import Blueprint

simple_page = Blueprint('simple_page', __name__)

@simple_page.route('/index')
def index():
return "Hello, World!"
from flask import Flask
from yourmodule import simple_page # 导入蓝图

app = Flask(__name__)
app.register_blueprint(simple_page) # 注册蓝图

当访问 /index 时,Flask 将会调用 simple_page.index 视图函数。

迁移数据库

使用flask_orm对数据库进行迁移

实例化

新建ext.py文件,并且在该文件实例化flask_sqlalchemy

# !/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@File : exts.py
"""

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
session = db.session

定义模型

Model文件夹下新建表模型文件,一个类对应数据库中的一个表

一个Python文件里可以有多个类(数据库表)

from exts import db


class Solutions(db.Model):
"""
解决方案模型
"""
__tablename__ = 'solutions'

solution_id = db.Column(db.String(20), primary_key=True, comment='解决方案ID') # 解决方案ID
solution_name = db.Column(db.String(50), comment='解决方案名称') # 解决方案名称
solution_desc = db.Column(db.String(200), comment='解决方案描述') # 解决方案描述

create_time = db.Column(db.DateTime, comment='创建时间') # 创建时间

迁移脚本

新建 manage.py 文件,在里面编写 orm 数据库迁移脚本

将刚刚定义的数据库表模型导入到该文件中

可以采用 from ... import * 的方式将改文件中的所有类都引入

# !/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@File : manage.py
"""

from flask_migrate import Migrate

from apps import create_app
from apps.models.solution_models import *


from exts import db

app = create_app()

Migrate(app, db)

迁移命令

命令 描述
flask db init 初始化迁移环境
flask db migrate 创建迁移脚本
flask db upgrade 应用迁移到数据库
flask db downgrade 回滚迁移
flask db current 查看当前数据库版本
flask db history 查看迁移历史

flask默认的迁移脚本名称是app.py,如果额外定义其他名称的脚本文件,如上面的例子manage.py,则需要使用–app参数指定

如:flask --app manage.py db init

流程图

flowchart TD
A[首次迁移] --> B[安装依赖]
B --> C["flask db init<br>(初始化迁移环境)"]
C --> D["定义模型类<br>(User, Post等)"]
D --> E["flask db migrate -m 'initial migration'<br>(生成迁移脚本)"]
E --> F["flask db upgrade<br>(应用迁移到数据库)"]

G[修改表结构] --> H["修改模型类<br>(添加/删除字段等)"]
H --> I["flask db migrate -m 'add column'<br>(生成新迁移脚本)"]
I --> J["flask db upgrade<br>(应用新迁移)"]

style A fill:#f9f,stroke:#333
style G fill:#9f9,stroke:#333

定时任务

关键词:flask定时任务

参考:Flask-APScheduler详细配置使用(附带API调用) - 个人文章 - SegmentFault 思否

Flask解决80版本Chrome的Session问题

chrome 80 版本之后,谷歌把cookieSameSite属性,从None改成了Lax,默认拦截SameSite=Lax所以我们需要把SameSite属性改为None

因此需要Flask的配置中加上如下内容

from flask import Flask, session, request, jsonify
from flask_cors import * # 这里引用flask_cors包

app = Flask(__name__)
CORS(app, supports_credentials=True) # 关键是这一句设置跨域
app.config['SESSION_COOKIE_SAMESITE'] = "None" # 设置samesite 为None
app.config['SESSION_COOKIE_SECURE'] = True # SECURE 为 true

flask实现高并发

关键词:gunicorn、高并发

参考:【flask】适合生产环境的高并发部署方案(gunicorn + gevent + supervisor)_gunicorn gevent-CSDN博客

Linux

使用gunicorn启动flask实现高并发

gunicorn配置文件guni.py

from gevent import monkey

monkey.patch_all()
import multiprocessing

debug = True
loglevel = 'debug'
bind = '127.0.0.1:8001'
pidfile = '/www/poshast/code/poshast/logs/gunicorn.pid'
logfile = '/www/poshast/code/poshast/logs/debug.log'
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gevent' # 默认为阻塞模式,最好选择gevent模式

启动命令

gunicorn -c guni.py run:app

run是当前项目目录下的run.py,app是run文件里的flask实例

Windows

使用waitress包裹Flask服务

from waitress import serve

...

if __name__ == '__main__':
# 启动Flask应用
# app.run(host='0.0.0.0', port=8001, processes=False)

# 使用waitress启动应用
serve(app, host='0.0.0.0', port=8001, threads=4)