Flask通用配置
一、依赖库
# 微信小程序解密
Linux: pip install Crypto
windows: pip install pycryptodome
pip install flask-migrate # 迁移库
pip install flask-wtf # 表单验证
pip install flask-mail # 邮件发送功能
pip install email_validator # 邮箱功能,字段校验Email依赖库
pip install PyOpenSSL # flask https启动
二、使用
- 架构设计
blueprints 存放蓝图文件夹(视图函数)
usemethod 蓝图中用到的方法
static 静态文件
templates 模板文件
config.py 配置文件
app.py 入口文件
exts.py 扩展文件,放flask后面按照的扩展插件
db=SQLAlchemy()放在这里, 防止app.py与models.py循环引用
models.py 模型文件
-
项目通用内容
- models.py 见https://www.cnblogs.com/moyezq/p/17171668.html
- app.py
import config from flask import Flask, jsonify from blueprints.auth import bp as au_bp from blueprints.question import bp as qu_bp from flask_migrate import Migrate from models import * # from flask_mail import Message app = Flask(__name__) # 绑定配置文件 app.config.from_object(config) # 数据库绑定app db.init_app(app) # 数据迁移 migrate = Migrate(app, db) # ORM模型映射三步 # 1. flask db init: 只需要执行一次 # 会生成一个migrations文件夹,里面存放一些迁移脚本 # 2. flask db migrate:识别ORM模型的改变,生成迁移脚本 # 会在migrations文件夹的versions文件夹生成迁移脚本 # 3. flask db upgrade: 运行迁移脚本,同步到数据库中 # 会在数据中生成一个表记录迁移脚本ID # 4. 数据以后再有改动只需要执行2、3步骤即可 # app绑定蓝图 app.register_blueprint(au_bp) app.register_blueprint(qu_bp) # 钩子函数hook # 使用:装饰器app.钩子函数 # before_request/before_first_request/after_request # 例子: @app.before_request def my_before_request(): user_id = session.get("user_id") if user_id: user = UserModel.query.get(user_id) setattr(g, "user", user) else: setattr(g, "user", None) # 上下文处理器 # 在上下文处理器返回的所有变量都能被所有模板访问到 @app.context_processor def my_context_processor(): return {"user": g.user}
- exts.py 扩展文件
from flask_sqlalchemy import SQLAlchemy # SQLAlchemy先创建一个空的,导入到app中在绑定app,防止循环引用 db = SQLAlchemy()
- 配置文件config.py
# 数据库配置 HOSTNAME = "127.0.0.1" PORT = 3306 USERNAME = "root" PASSWORD = "root" DATABASE = "infor" DB_URI = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8" SQLALCHEMY_DATABASE_URI = DB_URI # 邮箱配置 MAIL_SERVER = "" # 邮箱服务类型 MAIL_USE_SSL = True MAIL_PORT = MAIL_USERNAME = "" # 邮箱地址 MAIL_PASSWORD = "" # 邮箱密码 MAIL_DEFAULT_SENDER = "" # 邮箱默认发送者
- blueprint: 模块化/蓝图,例如:电影、图书、音乐...
- pycharm新建Python Package,名字就叫blueprint
- 在blueprint文件下创建对应视图文件,例如: 用户user.py、图书book.py
- 每一个视图文件配置:
from flask import Blueprint # name为蓝图的名字,url_prefix为前缀,设置后这个蓝图所有视图函数都必须以auth开头 # 例如: auth bp = Blueprint(name, __name__, url_prefix="") # 下面用bp.route装饰视图函数,这样被装饰的视图方法要访问都会带前缀 # /auth/login bp.route("/login") def login(): pass # auth.py的部分例子 import json import requests from flask import request, Blueprint, session, g # g是全局的意思 from usemethod.WXBizDataCrypt import WXBizDataCrypt from exts import db from models import UserModel from werkzeug.security import generate_password_hash, check_password_hash # 密码校验,可用户登录注册 bp = Blueprint("auth", __name__, url_prefix="/auth") # 概念与技巧 # cookie中不适合存放太多的数据,只适合存储少量数据,例如:登录授权的令牌token # flask中的session,是经过加密后存储在cookie中的
三、项目的云服务器部署
- 前期准备
pip install gunicorn
- 启动
# http
gunicorn -w 4 -b 0.0.0.0:8006 app:app
# https(需要配合Nginx)
gunicorn -w 4 -b 0.0.0.0:8006 app:app --certfile=xxx.pem --keyfile=xxx.key
# 测试常驻后台
screen gunicorn -w 4 -b 0.0.0.0:5000 app:app --timeout 120
# 说明
# gunicorn -w 进程数量 -b 监听地址:监听端口 运行文件名称:Flask程序实例名
# -D是后台运行,放-w前面即可,如果想在终端界面看启动状况就不加
# -w是--worker的缩写,开启的worker数量
# -b是--bind的缩写,主机地址和端口
# app:app,第一个app是flask启动文件app.py的文件名,第二个app是app.py里面那个app = Flask(__name__)的app对象
# --certfile是认证证书路径,阿里云的免费证书是pem后缀,填这里即可,有些证书可能是crt后缀
# --keyfile是私钥路径,key后缀文件只有一种,很好辨认
# --timeout 设置gunicorn进程的超时时间