Flask中redis的配置与使用

注意点:

在__init__.py中需要将redis_store设置成全局变量,这样方便其他文件导入

一、config.py
python 复制代码
import logging
import os
from datetime import timedelta

from redis import StrictRedis


class Config:
    # 调试信息
    DEBUG = True
    SECRET_KEY = os.urandom(32)
    JWT_SECRET = os.urandom(32)
    JWT_EXPIRY_SECOND = 5

    # 数据库信息
    MYSQL_DIALECT = 'mysql'
    MYSQL_DIRVER = 'pymysql'
    MYSQL_NAME = 'root'
    MYSQL_PWD = '123456'
    MYSQL_HOST = 'localhost'
    MYSQL_PORT = 3306
    MYSQL_DB = 'manger'
    MYSQL_CHARSET = 'utf8mb4'
    SQLALCHEMY_DATABASE_URI = f'{MYSQL_DIALECT}+{MYSQL_DIRVER}://{MYSQL_NAME}:{MYSQL_PWD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DB}?charset={MYSQL_CHARSET}'
    SQLALCHEMY_TRACK_MODIFICATIONS = True

    # redis配置
    REDIS_HOST = '127.0.0.1'
    REDIS_PORT = 6379

    # session配置
    # SESSION_TYPE = 'filesystem'  # 设置session的存储类型
    # SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT)  # 指定session存储的服务器
    # SESSION_USE_SIGNER = True  # 设置签名存储
    # PERMANENT_SESSION_LIFETIME = timedelta(days=1)  # 设置签名过期时间

    # 配置默认的log等级
    LEVEL_NAME = logging.DEBUG


# 开发环境配置信息
class DevelopConfig(Config):
    pass


# 生产(线上)环境配置信息
class ProductConfig(Config):
    DEBUG = False


# 测试环境配置信息
class TestConfig(Config):
    pass


# 提供一个统一的访问入口
config_dict = {
    "develop": DevelopConfig,
    "product": ProductConfig,
    "test": TestConfig
}
二、init.py
python 复制代码
import logging
from logging.handlers import RotatingFileHandler

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from redis import StrictRedis
from flask_session import Session

from config import Config, config_dict

db = SQLAlchemy()
redis_store = None


def create_app(config_name):
    app = Flask(__name__)

    # 获取config配置
    config = config_dict.get(config_name)

    app.config.from_object(config)

    # 调用日志方法,记录程序运行信息
    log_file(config.LEVEL_NAME)

    # 创建数据库关联对象并关联app
    db.init_app(app)

    # 创建redis对象
    # 当 decode_responses 设置为 True 时,Redis 返回的字符串数据将会被解码为 Python 字符串类型。这样可以方便地处理 Redis 中存储的文本数据。
    # 而当 decode_responses 设置为 False(默认值)时,Redis 返回的字符串数据将会以字节字符串(bytes)的形式返回。
    # 这在处理二进制数据或者需要与其他 Redis 客户端进行交互时可能更为合适
    global redis_store
    redis_store = StrictRedis(host=config.REDIS_HOST, port=config.REDIS_PORT, decode_responses=True)

    # # 创建session对象
    # Session(app)

    # 注册蓝图
    from manger.user import user_blue
    app.register_blueprint(user_blue)

    return app
三、app.py
python 复制代码
from manger import create_app, db
from flask_migrate import Migrate
from manger import models

# 传入settings参数,开发版本"develop",线上版本"product"
app = create_app('develop')

# 数据库设置
migrate = Migrate(app, db)


@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'


if __name__ == '__main__':
    app.run()
四、views中使用,登录
python 复制代码
@user_blue.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')
    if not all([username, password]):
        return JsonResponse.error(msg='缺少必要参数!').to_response()
    try:
        user_obj = models.User.query.filter(models.User.name == username).first()
    except Exception as e:
        current_app.logger.error(e)
    if not user_obj.check_password(password):
        return JsonResponse.error(msg='密码错误!').to_response()

    token = encode_token(user_obj.id, username, password)
    # 将token存入redis中
    redis_store.set('token', token)
    # 设置过期时间
    redis_store.expire('token', 20)  
    data = {
        "data": user_obj.to_dict(),
        "token": token
    }

    return JsonResponse(code=200, data=data, msg='登录成功!').to_response()
相关推荐
叫我:松哥7 分钟前
基于Flask的在线考试刷题系统设计与实现,集智能练习、过程追踪、深度分析与个性化引导
数据库·人工智能·后端·python·flask·boostrap
我命由我1234523 分钟前
Android 开发问题:EditText 控件的 android:imeOptions=“actionDone“ 属性不生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我命由我1234532 分钟前
Android 开发问题:获取到的 Android ID 发生了变化
android·java·开发语言·java-ee·android studio·android jetpack·android runtime
uoKent36 分钟前
Redis环境搭建与redis-cli基础操作
数据库·redis·缓存
恋猫de小郭40 分钟前
由于 iOS 26 的键盘变化,Flutter 又要重构键盘区域逻辑
android·前端·flutter
我命由我123451 小时前
Android 开发问题:Unable to find explicit activity class
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我命由我123451 小时前
Android 开发问题:全局的主题颜色设置,导致 CheckBox 控件在勾选状态下不显示样式
android·java·开发语言·java-ee·intellij-idea·intellij idea·android jetpack
Kapaseker1 小时前
一个丝滑的数字计数器,讲清楚 AnimatedContent 怎么用
android·kotlin
故渊at1 小时前
第十六板块:Android 综合实战与架构复盘 | 第三十七篇:从开机到桌面点击的全链路架构复盘
android·架构·冷启动·热启动·架构复盘·开机到桌面
私人珍藏库1 小时前
[Android] 红妆相机-拍照美颜图片美化工具
android·数码相机·app·软件·多功能