[project] name = "backend" version = "2.0.0" description = "fastapiadmin后端工程" readme = "README.md" requires-python = ">=3.12" dependencies = [ "agno==2.5.8", "aiofiles==24.1.0", # 文件操作 "aiosmtplib>=3.0.2", # 异步 SMTP 邮件发送(fastapi-mail 要求 >=3.0.2) "aiosqlite==0.22.1", # sqlite 异步操作数据库 "alembic==1.18.4", # 数据库迁移 "apscheduler==3.11.0", # 定时任务 "asyncmy==0.2.11", # mysql 异步操作数据库:基于 mysqlclient:asyncmy 是 mysqlclient 的异步版本,mysqlclient 是一个 C 语言编写的 MySQL 客户端,性能较高。性能:asyncmy 通常在性能上优于 aiomysql,特别是在高并发和大数据量的场景下。 "asyncpg==0.31.0", # postgresql 异步操作数据库 "bleach==6.4.0", # 过滤 HTML 标签 "click==8.1.7", # 命令行参数解析 "croniter>=1.0.12,<5.0.0", # cron 表达式解析 "cryptography==49.0.0", # mysql8 密码加密 "fastapi==0.115.2", # fastapi 框架 "fastapi-limiter==0.1.6", # 接口限流 "greenlet==3.5.2", # 协程核心依赖(SQLAlchemy 异步) "httpx==0.28.1", # HTTP 客户端 "jinja2==3.1.6", # 模板引擎 "loguru==0.7.3", # 日志 "openai==2.28.0", # OpenAI API 客户端 "openpyxl==3.1.5", # Excel "pandas==3.0.3", # 数据处理 "pillow==12.2.0", # 图片处理 "psutil==7.2.2", # 系统信息 "psycopg[binary]==3.3.2", # postgresql 同步驱动(含预编译 libpq,开箱即用) "pydantic-settings>=2.6.1", # 配置设置(fastapi-mail 要求 >=2.6.1) "pyjwt==2.13.0", # OAuth2 "pymysql==1.2.0", # mysql 同步步操作数据库基于 pymysql:aiomysql 是 pymysql 的异步版本,pymysql 是一个纯 Python 实现的 MySQL 客户端。成熟度:aiomysql 相对较为成熟,社区支持较好,文档也比较完善。 "python-multipart==0.0.32", # request.form() 对表单进行「解析」时安装 "redis==7.1.0", # redis 同/异步操作数据库(用户celery配套使用)redis 异步操作数据库 redis已经完全具备了aioredis的功能,无需重复安全,且aioredis已经不再维护也不兼容3.10+的版本 "rich==15.0.0", # 终端打印美化 "sqlalchemy>=2.0.51,<2.1", # 数据库ORM "sqlglot[rs]==27.8.0", # sql 解析 "typer==0.26.7", # 命令行工具 "ua-parser==1.0.2", # 解析 User-Agent 获取 OS/浏览器 "uvicorn==0.49.0", # uvicorn web 框架 "websockets>=16.0,<17.0", # websocket 通信 "fastapi-mail==1.5.1", # 邮件发送(简化 EmailSendService 底层) "tinycss2==1.5.1", "weasyprint==69.0", "fastapi-cache2[redis]>=0.1.8", ] [dependency-groups] dev = [ "fakeredis>=2.21.0,<3", # 测试:内存 Redis,配合 TESTING "pytest==9.0.2", "pytest-asyncio>=0.24.0", # 异步测试支持 "ruff==0.14.13", # 代码检查/格式化 ] [tool.uv] default-groups = ["dev"] # 本地 uv sync 含 dev;生产 pip -r requirements.txt 不含 pytest/ruff/fakeredis [[tool.uv.index]] name = "tuna" url = "https://pypi.tuna.tsinghua.edu.cn/simple" [tool.ruff] line-length = 200 indent-width = 4 preview = false fix = true show-fixes = true exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".ipynb_checkpoints", ".mypy_cache", ".nox", ".pants.d", ".pyenv", ".pytest_cache", ".pytype", ".ruff_cache", ".svn", ".tox", ".venv", ".vscode", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "site-packages", "venv", ] extend-include = ["*.pyw"] [tool.ruff.lint] select = [ "FAST", "F", "E", "W", "F", "I", "B", "C4", "UP", ] ignore = [ "E501", # line too long, handled by black "B008", # do not perform function calls in argument defaults "C901", # too complex "W191", # indentation contains tabs "B904", # Within an `except` clause "B010", # Do not call with a constant attribute value. "B009", # Do not use getattr() with a constant attribute value. "E712", # Avoid equality comparisons to `False`; use `not getattr(self.model, "is_deleted"):` for false checks "W293", # blank line with whitespace ] [tool.ruff.lint.per-file-ignores] "tests/conftest.py" = ["E402"] # 先设置 TESTING/SQLite 环境再 import 应用 [tool.ruff.format] docstring-code-format = true preview = false quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function"