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()
相关推荐
芊言芊语13 分钟前
分布式缓存服务Redis版解析与配置方式
redis·分布式·缓存
CCTV果冻爽1 小时前
Android 源码集成可卸载 APP
android
攻城狮的梦1 小时前
redis集群模式连接
数据库·redis·缓存
秋月霜风2 小时前
mariadb主从配置步骤
android·adb·mariadb
Python私教3 小时前
Python ORM 框架 SQLModel 快速入门教程
android·java·python
编程乐学4 小时前
基于Android Studio 蜜雪冰城(奶茶饮品点餐)—原创
android·gitee·android studio·大作业·安卓课设·奶茶点餐
Amagi.4 小时前
Redis的内存淘汰策略
数据库·redis·mybatis
无休居士5 小时前
【实践】应用访问Redis突然超时怎么处理?
数据库·redis·缓存
problc5 小时前
Android中的引用类型:Weak Reference, Soft Reference, Phantom Reference 和 WeakHashMap
android
IH_LZH5 小时前
Broadcast:Android中实现组件及进程间通信
android·java·android studio·broadcast