- 新增图像生成接口,支持试用、积分和自定义API Key模式 - 实现生成图片结果异步上传至MinIO存储,带重试机制 - 优化积分预扣除和异常退还逻辑,保障用户积分准确 - 添加获取生成历史记录接口,支持时间范围和分页 - 提供本地字典配置接口,支持模型、比例、提示模板和尺寸 - 实现图片批量上传接口,支持S3兼容对象存储 feat(admin): 增加管理员角色管理与权限分配接口 - 实现角色列表查询、角色创建、更新及删除功能 - 增加权限列表查询接口 - 实现用户角色分配接口,便于统一管理用户权限 - 增加系统字典增删查改接口,支持分类过滤和排序 - 权限控制全面覆盖管理接口,保证安全访问 feat(auth): 完善用户登录注册及权限相关接口与页面 - 实现手机号验证码发送及校验功能,保障注册安全 - 支持手机号注册、登录及退出接口,集成日志记录 - 增加修改密码功能,验证原密码后更新 - 提供动态导航菜单接口,基于权限展示不同菜单 - 实现管理界面路由及日志、角色、字典管理页面访问权限控制 - 添加系统日志查询接口,支持关键词和等级筛选 feat(app): 初始化Flask应用并配置蓝图与数据库 - 创建应用程序工厂,加载配置,初始化数据库和Redis客户端 - 注册认证、API及管理员蓝图,整合路由 - 根路由渲染主页模板 - 应用上下文中自动创建数据库表,保证运行环境准备完毕 feat(database): 提供数据库创建与迁移支持脚本 - 新增数据库创建脚本,支持自动检测是否已存在 - 添加数据库表初始化脚本,支持创建和删除所有表 - 实现RBAC权限初始化,包含基础权限和角色创建 - 新增字段手动修复脚本,添加用户API Key和积分字段 - 强制迁移脚本支持清理连接和修复表结构,初始化默认数据及角色分配 feat(config): 新增系统配置参数 - 配置数据库、Redis、Session和MinIO相关参数 - 添加AI接口地址及试用Key配置 - 集成阿里云短信服务配置及开发模式相关参数 feat(extensions): 初始化数据库、Redis和MinIO客户端 - 创建全局SQLAlchemy数据库实例和Redis客户端 - 配置基于boto3的MinIO兼容S3客户端 chore(logs): 添加示例系统日志文件 - 记录用户请求、验证码发送成功与失败的日志信息
267 lines
12 KiB
Plaintext
267 lines
12 KiB
Plaintext
Metadata-Version: 2.4
|
||
Name: redis
|
||
Version: 7.1.0
|
||
Summary: Python client for Redis database and key-value store
|
||
Project-URL: Changes, https://github.com/redis/redis-py/releases
|
||
Project-URL: Code, https://github.com/redis/redis-py
|
||
Project-URL: Documentation, https://redis.readthedocs.io/en/latest/
|
||
Project-URL: Homepage, https://github.com/redis/redis-py
|
||
Project-URL: Issue tracker, https://github.com/redis/redis-py/issues
|
||
Author-email: "Redis Inc." <oss@redis.com>
|
||
License-Expression: MIT
|
||
License-File: LICENSE
|
||
Keywords: Redis,database,key-value-store
|
||
Classifier: Development Status :: 5 - Production/Stable
|
||
Classifier: Environment :: Console
|
||
Classifier: Intended Audience :: Developers
|
||
Classifier: License :: OSI Approved :: MIT License
|
||
Classifier: Operating System :: OS Independent
|
||
Classifier: Programming Language :: Python
|
||
Classifier: Programming Language :: Python :: 3
|
||
Classifier: Programming Language :: Python :: 3 :: Only
|
||
Classifier: Programming Language :: Python :: 3.10
|
||
Classifier: Programming Language :: Python :: 3.11
|
||
Classifier: Programming Language :: Python :: 3.12
|
||
Classifier: Programming Language :: Python :: 3.13
|
||
Classifier: Programming Language :: Python :: 3.14
|
||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||
Requires-Python: >=3.10
|
||
Requires-Dist: async-timeout>=4.0.3; python_full_version < '3.11.3'
|
||
Provides-Extra: circuit-breaker
|
||
Requires-Dist: pybreaker>=1.4.0; extra == 'circuit-breaker'
|
||
Provides-Extra: hiredis
|
||
Requires-Dist: hiredis>=3.2.0; extra == 'hiredis'
|
||
Provides-Extra: jwt
|
||
Requires-Dist: pyjwt>=2.9.0; extra == 'jwt'
|
||
Provides-Extra: ocsp
|
||
Requires-Dist: cryptography>=36.0.1; extra == 'ocsp'
|
||
Requires-Dist: pyopenssl>=20.0.1; extra == 'ocsp'
|
||
Requires-Dist: requests>=2.31.0; extra == 'ocsp'
|
||
Description-Content-Type: text/markdown
|
||
|
||
# redis-py
|
||
|
||
The Python interface to the Redis key-value store.
|
||
|
||
[](https://github.com/redis/redis-py/actions?query=workflow%3ACI+branch%3Amaster)
|
||
[](https://redis.readthedocs.io/en/stable/)
|
||
[](./LICENSE)
|
||
[](https://pypi.org/project/redis/)
|
||
[](https://github.com/redis/redis-py/releases)
|
||
[](https://codecov.io/gh/redis/redis-py)
|
||
|
||
[Installation](#installation) | [Usage](#usage) | [Advanced Topics](#advanced-topics) | [Contributing](https://github.com/redis/redis-py/blob/master/CONTRIBUTING.md)
|
||
|
||
---------------------------------------------
|
||
|
||
**Note:** redis-py 5.0 is the last version of redis-py that supports Python 3.7, as it has reached [end of life](https://devguide.python.org/versions/). redis-py 5.1 supports Python 3.8+.<br>
|
||
**Note:** redis-py 6.1.0 is the last version of redis-py that supports Python 3.8, as it has reached [end of life](https://devguide.python.org/versions/). redis-py 6.2.0 supports Python 3.9+.
|
||
**Note:** redis-py 7.0.1 is the last version of redis-py that supports Python 3.9, as it has reached [end of life](https://devguide.python.org/versions/). redis-py 7.1.0 supports Python 3.10+.
|
||
|
||
---------------------------------------------
|
||
|
||
## How do I Redis?
|
||
|
||
[Learn for free at Redis University](https://redis.io/learn/university)
|
||
|
||
[Try the Redis Cloud](https://redis.io/try-free/)
|
||
|
||
[Dive in developer tutorials](https://redis.io/learn)
|
||
|
||
[Join the Redis community](https://redis.io/community/)
|
||
|
||
[Work at Redis](https://redis.io/careers/)
|
||
|
||
## Installation
|
||
|
||
Start a redis via docker (for Redis versions >= 8.0):
|
||
|
||
``` bash
|
||
docker run -p 6379:6379 -it redis:latest
|
||
```
|
||
|
||
Start a redis via docker (for Redis versions < 8.0):
|
||
|
||
``` bash
|
||
docker run -p 6379:6379 -it redis/redis-stack:latest
|
||
```
|
||
To install redis-py, simply:
|
||
|
||
``` bash
|
||
$ pip install redis
|
||
```
|
||
|
||
For faster performance, install redis with hiredis support, this provides a compiled response parser, and *for most cases* requires zero code changes.
|
||
By default, if hiredis >= 1.0 is available, redis-py will attempt to use it for response parsing.
|
||
|
||
``` bash
|
||
$ pip install "redis[hiredis]"
|
||
```
|
||
|
||
Looking for a high-level library to handle object mapping? See [redis-om-python](https://github.com/redis/redis-om-python)!
|
||
|
||
## Supported Redis Versions
|
||
|
||
The most recent version of this library supports Redis version [7.2](https://github.com/redis/redis/blob/7.2/00-RELEASENOTES), [7.4](https://github.com/redis/redis/blob/7.4/00-RELEASENOTES), [8.0](https://github.com/redis/redis/blob/8.0/00-RELEASENOTES) and [8.2](https://github.com/redis/redis/blob/8.2/00-RELEASENOTES).
|
||
|
||
The table below highlights version compatibility of the most-recent library versions and redis versions.
|
||
|
||
| Library version | Supported redis versions |
|
||
|-----------------|-------------------|
|
||
| 3.5.3 | <= 6.2 Family of releases |
|
||
| >= 4.5.0 | Version 5.0 to 7.0 |
|
||
| >= 5.0.0 | Version 5.0 to 7.4 |
|
||
| >= 6.0.0 | Version 7.2 to current |
|
||
|
||
|
||
## Usage
|
||
|
||
### Basic Example
|
||
|
||
``` python
|
||
>>> import redis
|
||
>>> r = redis.Redis(host='localhost', port=6379, db=0)
|
||
>>> r.set('foo', 'bar')
|
||
True
|
||
>>> r.get('foo')
|
||
b'bar'
|
||
```
|
||
|
||
The above code connects to localhost on port 6379, sets a value in Redis, and retrieves it. All responses are returned as bytes in Python, to receive decoded strings, set *decode_responses=True*. For this, and more connection options, see [these examples](https://redis.readthedocs.io/en/stable/examples.html).
|
||
|
||
|
||
#### RESP3 Support
|
||
To enable support for RESP3, ensure you have at least version 5.0 of the client, and change your connection object to include *protocol=3*
|
||
|
||
``` python
|
||
>>> import redis
|
||
>>> r = redis.Redis(host='localhost', port=6379, db=0, protocol=3)
|
||
```
|
||
|
||
### Connection Pools
|
||
|
||
By default, redis-py uses a connection pool to manage connections. Each instance of a Redis class receives its own connection pool. You can however define your own [redis.ConnectionPool](https://redis.readthedocs.io/en/stable/connections.html#connection-pools).
|
||
|
||
``` python
|
||
>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
|
||
>>> r = redis.Redis(connection_pool=pool)
|
||
```
|
||
|
||
Alternatively, you might want to look at [Async connections](https://redis.readthedocs.io/en/stable/examples/asyncio_examples.html), or [Cluster connections](https://redis.readthedocs.io/en/stable/connections.html#cluster-client), or even [Async Cluster connections](https://redis.readthedocs.io/en/stable/connections.html#async-cluster-client).
|
||
|
||
### Redis Commands
|
||
|
||
There is built-in support for all of the [out-of-the-box Redis commands](https://redis.io/commands). They are exposed using the raw Redis command names (`HSET`, `HGETALL`, etc.) except where a word (i.e. del) is reserved by the language. The complete set of commands can be found [here](https://github.com/redis/redis-py/tree/master/redis/commands), or [the documentation](https://redis.readthedocs.io/en/stable/commands.html).
|
||
|
||
## Advanced Topics
|
||
|
||
The [official Redis command documentation](https://redis.io/commands)
|
||
does a great job of explaining each command in detail. redis-py attempts
|
||
to adhere to the official command syntax. There are a few exceptions:
|
||
|
||
- **MULTI/EXEC**: These are implemented as part of the Pipeline class.
|
||
The pipeline is wrapped with the MULTI and EXEC statements by
|
||
default when it is executed, which can be disabled by specifying
|
||
transaction=False. See more about Pipelines below.
|
||
|
||
- **SUBSCRIBE/LISTEN**: Similar to pipelines, PubSub is implemented as
|
||
a separate class as it places the underlying connection in a state
|
||
where it can\'t execute non-pubsub commands. Calling the pubsub
|
||
method from the Redis client will return a PubSub instance where you
|
||
can subscribe to channels and listen for messages. You can only call
|
||
PUBLISH from the Redis client (see [this comment on issue
|
||
#151](https://github.com/redis/redis-py/issues/151#issuecomment-1545015)
|
||
for details).
|
||
|
||
For more details, please see the documentation on [advanced topics page](https://redis.readthedocs.io/en/stable/advanced_features.html).
|
||
|
||
### Pipelines
|
||
|
||
The following is a basic example of a [Redis pipeline](https://redis.io/docs/manual/pipelining/), a method to optimize round-trip calls, by batching Redis commands, and receiving their results as a list.
|
||
|
||
|
||
``` python
|
||
>>> pipe = r.pipeline()
|
||
>>> pipe.set('foo', 5)
|
||
>>> pipe.set('bar', 18.5)
|
||
>>> pipe.set('blee', "hello world!")
|
||
>>> pipe.execute()
|
||
[True, True, True]
|
||
```
|
||
|
||
### PubSub
|
||
|
||
The following example shows how to utilize [Redis Pub/Sub](https://redis.io/docs/manual/pubsub/) to subscribe to specific channels.
|
||
|
||
``` python
|
||
>>> r = redis.Redis(...)
|
||
>>> p = r.pubsub()
|
||
>>> p.subscribe('my-first-channel', 'my-second-channel', ...)
|
||
>>> p.get_message()
|
||
{'pattern': None, 'type': 'subscribe', 'channel': b'my-second-channel', 'data': 1}
|
||
```
|
||
|
||
### Redis’ search and query capabilities default dialect
|
||
|
||
Release 6.0.0 introduces a client-side default dialect for Redis’ search and query capabilities.
|
||
By default, the client now overrides the server-side dialect with version 2, automatically appending *DIALECT 2* to commands like *FT.AGGREGATE* and *FT.SEARCH*.
|
||
|
||
**Important**: Be aware that the query dialect may impact the results returned. If needed, you can revert to a different dialect version by configuring the client accordingly.
|
||
|
||
``` python
|
||
>>> from redis.commands.search.field import TextField
|
||
>>> from redis.commands.search.query import Query
|
||
>>> from redis.commands.search.index_definition import IndexDefinition
|
||
>>> import redis
|
||
|
||
>>> r = redis.Redis(host='localhost', port=6379, db=0)
|
||
>>> r.ft().create_index(
|
||
>>> (TextField("name"), TextField("lastname")),
|
||
>>> definition=IndexDefinition(prefix=["test:"]),
|
||
>>> )
|
||
|
||
>>> r.hset("test:1", "name", "James")
|
||
>>> r.hset("test:1", "lastname", "Brown")
|
||
|
||
>>> # Query with default DIALECT 2
|
||
>>> query = "@name: James Brown"
|
||
>>> q = Query(query)
|
||
>>> res = r.ft().search(q)
|
||
|
||
>>> # Query with explicit DIALECT 1
|
||
>>> query = "@name: James Brown"
|
||
>>> q = Query(query).dialect(1)
|
||
>>> res = r.ft().search(q)
|
||
```
|
||
|
||
You can find further details in the [query dialect documentation](https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/dialects/).
|
||
|
||
### Multi-database client (Active-Active)
|
||
|
||
The multi-database client allows your application to connect to multiple Redis databases, which are typically replicas of each other. It is designed to work with Redis Software and Redis Cloud Active-Active setups. The client continuously monitors database health, detects failures, and automatically fails over to the next healthy database using a configurable strategy. When the original database becomes healthy again, the client can automatically switch back to it.<br>
|
||
This is useful when:
|
||
|
||
1. You have more than one Redis deployment. This might include two independent Redis servers or two or more Redis databases replicated across multiple [active-active Redis Enterprise](https://redis.io/docs/latest/operate/rs/databases/active-active/) clusters.
|
||
2. You want your application to connect to one deployment at a time and to fail over to the next available deployment if the first deployment becomes unavailable.
|
||
|
||
For the complete failover configuration options and examples, see the [Multi-database client docs](https://redis.readthedocs.io/en/latest/multi_database.html).
|
||
|
||
---------------------------------------------
|
||
|
||
### Author
|
||
|
||
redis-py is developed and maintained by [Redis Inc](https://redis.io). It can be found [here](
|
||
https://github.com/redis/redis-py), or downloaded from [pypi](https://pypi.org/project/redis/).
|
||
|
||
Special thanks to:
|
||
|
||
- Andy McCurdy (<sedrik@gmail.com>) the original author of redis-py.
|
||
- Ludovico Magnocavallo, author of the original Python Redis client,
|
||
from which some of the socket code is still used.
|
||
- Alexander Solovyov for ideas on the generic response callback
|
||
system.
|
||
- Paul Hubbard for initial packaging support.
|
||
|
||
[](https://redis.io)
|