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进程的超时时间
posted @ 2023-03-06 17:32  默叶  阅读(86)  评论(0编辑  收藏  举报