From f145df4fa6286e64c236eeb066b2082142161f81 Mon Sep 17 00:00:00 2001 From: guoyoudu Date: Sun, 8 Feb 2026 20:06:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=93=E5=BA=93=E6=A8=A1=E5=9D=97=E5=AE=8C?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .trae/documents/服务注册管理解决方案.md | 125 ++++ backend.log | 323 ----------- backend/app/main.py | 3 +- .../models/__pycache__/models.cpython-312.pyc | Bin 8389 -> 9117 bytes backend/app/models/models.py | 53 +- backend/app/routes/__init__.py | 3 +- backend/app/routes/api_key.py | 88 --- backend/app/routes/permissions.py | 19 - backend/app/routes/repositories.py | 21 +- backend/app/routes/services.py | 543 +++++++++++++++++- backend/app/routes/user.py | 166 +++++- .../schemas/__pycache__/user.cpython-312.pyc | Bin 4416 -> 4088 bytes backend/app/schemas/user.py | 48 +- .../services/__pycache__/user.cpython-312.pyc | Bin 12075 -> 11699 bytes backend/app/services/permission.py | 23 +- backend/app/services/user.py | 116 ++-- backend/check_admin.py | 79 +++ backend/init_db.py | 22 +- backend/start_server.sh | 2 +- backend/update_db.py | 127 ++++ backend/uvicorn.log | 9 + frontend/src/router/index.ts | 13 +- frontend/src/stores/user.ts | 14 +- frontend/src/views/AdminView.vue | 9 +- frontend/src/views/RegisterView.vue | 37 +- frontend/src/views/admin/AdminApiKeysView.vue | 174 ------ .../admin/AdminServiceRegistrationView.vue | 185 +++--- frontend/src/views/admin/AdminUsersView.vue | 192 ++++--- frontend/vite.config.ts | 14 +- 29 files changed, 1415 insertions(+), 993 deletions(-) create mode 100644 .trae/documents/服务注册管理解决方案.md delete mode 100644 backend.log delete mode 100644 backend/app/routes/api_key.py create mode 100644 backend/check_admin.py create mode 100644 backend/update_db.py delete mode 100644 frontend/src/views/admin/AdminApiKeysView.vue diff --git a/.trae/documents/服务注册管理解决方案.md b/.trae/documents/服务注册管理解决方案.md new file mode 100644 index 0000000..d3c4c2a --- /dev/null +++ b/.trae/documents/服务注册管理解决方案.md @@ -0,0 +1,125 @@ +# 服务注册管理实施计划 + +## 项目现状分析 + +当前项目使用Vue 3 + FastAPI + PostgreSQL技术栈,已经实现了基本的服务注册功能,但存在以下问题: + +1. **前端认证机制不完善**:API调用缺少认证,导致加载仓库列表失败 +2. **服务注册功能不完整**:使用模拟数据,缺少真实的仓库信息获取 +3. **服务管理能力有限**:缺少服务分组、批量管理和监控功能 +4. **数据库管理界面缺失**:无法直接查看数据库中的服务和仓库信息 + +## 实施计划 + +### 第一阶段:修复基础功能(已完成) + +#### 1. 完善前端认证机制 +- **修改前端API调用**:确保所有API调用都使用axios并自动携带认证token +- **实现token管理**:添加token过期检测和自动刷新机制 +- **优化登录状态**:实现用户登录状态持久化和自动恢复 + +#### 2. 修复服务注册流程 +- **实现真实仓库列表加载**:调用后端API获取数据库中的仓库信息 +- **完善服务注册表单**:移除算法选择,添加仓库描述和地址展示 +- **优化表单验证**:添加更严格的表单验证和错误提示 + +#### 3. 增强后端服务注册API +- **实现真实仓库信息获取**:从数据库中查询仓库详细信息 +- **完善服务注册逻辑**:实现真实的服务创建和部署 +- **添加错误处理**:增强API错误处理和异常捕获 + +### 第二阶段:核心功能实现 + +#### 1. 服务分组前端界面 +- **分组管理功能**:创建、编辑、删除分组的弹窗界面 +- **服务分类展示**:左侧分组树状结构,右侧对应分组的服务列表 +- **服务与分组关联**:服务编辑时选择分组的下拉菜单 +- **界面设计**:清晰的视觉层次和交互反馈 + +#### 2. 服务监控功能 +- **健康检查机制**:后端定时任务检查服务状态,支持HTTP、TCP和自定义检查方式 +- **实时状态监控**:使用WebSocket实现前端实时数据更新,减少轮询开销 +- **监控指标**:CPU使用率、内存使用、响应时间、请求次数等核心指标 +- **前端展示**:实时状态卡片、异常告警弹窗、监控指标列表 +- **异常处理**:服务状态异常时触发告警,支持邮件通知(可选) + +### 第三阶段:系统集成和优化 + +#### 1. 系统集成测试 +- **测试范围**:服务分组管理、服务监控功能、服务注册流程、用户认证等核心功能 +- **测试方法**:单元测试(pytest)、API测试(requests)、前端集成测试(Vue Test Utils) +- **测试重点**:功能实现验证,确保所有核心功能正常运行 +- **测试目标**:确保系统稳定性和可靠性,不做复杂的性能测试 + +#### 2. 功能优化和完善 +- **数据库管理界面**:实现服务和仓库数据展示 +- **服务列表优化**:实现分页、筛选和详情展示 +- **API文档自动生成**:使用FastAPI内置文档功能 +- **文档完善**:API文档和使用说明 + +## 技术实现细节 + +### 前端技术实现 +- **使用Pinia管理状态**:实现用户登录状态和服务数据管理 +- **使用Element Plus组件**:构建美观的服务管理界面,包括Tree、Table、Dialog等组件 +- **使用axios拦截器**:实现API调用的统一认证处理 +- **使用WebSocket**:实现服务状态实时更新,减少轮询开销 + +### 后端技术实现 +- **使用FastAPI构建API**:实现高性能的服务管理API +- **使用SQLAlchemy操作数据库**:实现服务和仓库的持久化 +- **使用JWT进行认证**:实现安全的用户认证 +- **使用Docker管理服务**:实现服务的容器化部署 +- **使用apscheduler**:实现后端定时任务,用于服务健康检查 +- **使用websockets**:实现后端WebSocket服务,用于实时数据推送 + +### 数据库设计 +- **服务表**:存储服务基本信息、配置和状态 +- **服务分组表**:存储服务分组信息,与服务表建立一对多关系 +- **仓库表**:存储算法仓库信息,包括名称、描述和地址 +- **监控数据表**:存储服务监控指标和健康检查结果 + +### 核心API设计 + +#### 服务分组API +- `GET /api/service-groups`:获取所有服务分组 +- `POST /api/service-groups`:创建新的服务分组 +- `GET /api/service-groups/{group_id}`:获取单个服务分组详情 +- `PUT /api/service-groups/{group_id}`:更新服务分组信息 +- `DELETE /api/service-groups/{group_id}`:删除服务分组 + +#### 服务监控API +- `GET /api/services/{service_id}/status`:获取单个服务状态 +- `GET /api/services/status`:获取所有服务状态 +- `GET /api/services/{service_id}/metrics`:获取服务监控指标 +- `GET /api/services/metrics`:获取所有服务监控指标 + +#### WebSocket API +- `ws://{host}:{port}/ws/services`:实时服务状态更新 +- `ws://{host}:{port}/ws/metrics`:实时监控指标更新 + +## 预期效果 + +1. **稳定的服务注册**:用户可以正常注册新服务,系统能正确处理认证和数据存储 +2. **高效的服务管理**:支持服务分组管理和服务分类展示,提供清晰的服务组织方式 +3. **实时的服务监控**:通过WebSocket实现服务状态实时更新,及时发现和处理异常 +4. **完整的数据展示**:可以查看数据库中的所有服务和仓库信息,支持服务详情查看 +5. **良好的用户体验**:界面简洁直观,操作流程顺畅,响应速度快 +6. **可扩展的架构**:支持后续服务数量的增加和功能扩展 + +## 风险评估 + +1. **认证问题**:需要确保所有API调用都正确处理认证,避免401错误 +2. **WebSocket连接**:需要处理WebSocket连接的稳定性和断线重连 +3. **数据库性能**:需要优化数据库查询,确保服务管理的响应速度 +4. **服务部署**:需要确保服务部署的可靠性和稳定性 +5. **系统集成**:需要确保前后端和数据库的无缝集成 + +## 成功指标 + +1. **服务注册成功率**:100%的服务注册请求能够成功处理 +2. **服务管理响应时间**:服务列表加载时间小于2秒,操作响应时间小于1秒 +3. **监控数据更新**:监控数据更新延迟小于0.5秒,实现准实时监控 +4. **系统稳定性**:连续运行7天无故障,服务监控功能正常运行 +5. **用户满意度**:操作流程顺畅,界面美观易用,功能完整 +6. **功能完整性**:所有核心功能(服务分组、服务监控、系统集成)都能正常实现 \ No newline at end of file diff --git a/backend.log b/backend.log deleted file mode 100644 index 7f5ff32..0000000 --- a/backend.log +++ /dev/null @@ -1,323 +0,0 @@ -INFO: Will watch for changes in these directories: ['/Users/duguoyou/MLFlow/algorithm-showcase'] -INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) -INFO: Started reloader process [35671] using WatchFiles -Process SpawnProcess-1: -Traceback (most recent call last): - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap - self.run() - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 108, in run - self._target(*self._args, **self._kwargs) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started - target(sockets=sockets) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 61, in run - return asyncio.run(self.serve(sockets=sockets)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 195, in run - return runner.run(main) - ^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run - return self._loop.run_until_complete(task) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 68, in serve - config.load() - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/config.py", line 467, in load - self.loaded_app = import_from_string(self.app) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 24, in import_from_string - raise exc from None - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 21, in import_from_string - module = importlib.import_module(module_str) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/importlib/__init__.py", line 90, in import_module - return _bootstrap._gcd_import(name[level:], package, level) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1310, in _find_and_load_unlocked - File "", line 488, in _call_with_frames_removed - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1324, in _find_and_load_unlocked -ModuleNotFoundError: No module named 'app' -WARNING: WatchFiles detected changes in 'backend/app/__init__.py'. Reloading... -Process SpawnProcess-2: -Traceback (most recent call last): - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap - self.run() - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 108, in run - self._target(*self._args, **self._kwargs) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started - target(sockets=sockets) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 61, in run - return asyncio.run(self.serve(sockets=sockets)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 195, in run - return runner.run(main) - ^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run - return self._loop.run_until_complete(task) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 68, in serve - config.load() - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/config.py", line 467, in load - self.loaded_app = import_from_string(self.app) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 24, in import_from_string - raise exc from None - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 21, in import_from_string - module = importlib.import_module(module_str) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/importlib/__init__.py", line 90, in import_module - return _bootstrap._gcd_import(name[level:], package, level) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1310, in _find_and_load_unlocked - File "", line 488, in _call_with_frames_removed - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1324, in _find_and_load_unlocked -ModuleNotFoundError: No module named 'app' -WARNING: WatchFiles detected changes in 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/cygwinccompiler.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/tags.py', 'backend/venv39/lib/python3.9/site-packages/_distutils_hack/override.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/utils.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/ccompiler.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/install.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/filelist.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/check.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/py37compat.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/bdist_wininst.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/build_ext.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/upload_docs.py', 'backend/venv39/lib/python3.9/site-packages/_distutils_hack/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/config.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/errors.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/test.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/markers.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/wheel.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/text_file.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/clean.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/monkey.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/version.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/_msvccompiler.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/pyparsing.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/ordered_set.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/install.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/extern/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/build.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/build_ext.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/build_clib.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/build_clib.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/msvccompiler.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/util.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/dep_util.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/install_lib.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/glob.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/versionpredicate.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/__about__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/dist.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/dist_info.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/config.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/bdist_rpm.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/sysconfig.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/specifiers.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/debug.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/launch.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/dir_util.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/msvc9compiler.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/_compat.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/dep_util.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/more_itertools/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/bdist_rpm.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/msvc.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/egg_info.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/easy_install.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/install_data.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/depends.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/install_headers.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/sdist.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/build_py.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/markers.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/rotate.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/bdist.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/extension.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/archive_util.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/__about__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/sandbox.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/_typing.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/bdist_dumb.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/more_itertools/recipes.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/build_py.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/register.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/_structures.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/install_scripts.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/specifiers.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/install_lib.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/version.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/setopt.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/windows_support.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/package_index.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/py34compat.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/requirements.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/sdist.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/version.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/install_egg_info.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/build_scripts.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/requirements.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_imp.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/install_scripts.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/build_meta.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/version.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/spawn.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/upload.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/archive_util.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/alias.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/_compat.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/appdirs.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/bdist_egg.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/bcppcompiler.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/unicode_utils.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/py36compat.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/utils.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/extension.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/py38compat.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/installer.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/file_util.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/cmd.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/_typing.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_deprecation_warning.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/py35compat.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/extern/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/saveopts.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/packaging/_structures.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/config.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/dist.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/register.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/log.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/develop.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/fancy_getopt.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/command/install_egg_info.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/namespaces.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_vendor/more_itertools/more.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/core.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/__init__.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/bdist_msi.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/command/upload.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/errors.py', 'backend/venv39/lib/python3.9/site-packages/setuptools/_distutils/unixccompiler.py', 'backend/venv39/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/tags.py'. Reloading... -Process SpawnProcess-3: -Traceback (most recent call last): - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap - self.run() - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 108, in run - self._target(*self._args, **self._kwargs) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started - target(sockets=sockets) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 61, in run - return asyncio.run(self.serve(sockets=sockets)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 195, in run - return runner.run(main) - ^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run - return self._loop.run_until_complete(task) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 68, in serve - config.load() - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/config.py", line 467, in load - self.loaded_app = import_from_string(self.app) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 24, in import_from_string - raise exc from None - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 21, in import_from_string - module = importlib.import_module(module_str) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/importlib/__init__.py", line 90, in import_module - return _bootstrap._gcd_import(name[level:], package, level) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1310, in _find_and_load_unlocked - File "", line 488, in _call_with_frames_removed - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1324, in _find_and_load_unlocked -ModuleNotFoundError: No module named 'app' -WARNING: WatchFiles detected changes in 'backend/venv39/lib/python3.9/site-packages/pip/_internal/network/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/universaldetector.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/wrappers.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/proxy.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/structures.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/sanitizer.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/sysconfig.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/_internal_utils.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/_ihatexml.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/idna/compat.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/pyproject.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/gb2312freq.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/compat.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/distributions/sdist.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/distributions/installed.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/_asyncio.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/webencodings/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/certifi/__main__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/envbuild.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/build/wheel_legacy.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/metadata/pkg_resources.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/sbcharsetprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/webencodings/x_user_defined.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/req/req_set.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/requirements.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/selection_prefs.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/colorama/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/eucjpprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/shutil.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/euctwprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/certifi/core.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/index/collector.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/six.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/colorama/ansitowin32.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/provider.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/filetypes.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/install/legacy.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/factory.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/mbcssm.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/euctwfreq.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/index.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/locations/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/webencodings/tests.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/resources.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/pkg_resources.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/colorama/initialise.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/entrypoints.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/queue.py', 'backend/venv39/lib/python3.9/site-packages/pip/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/network/download.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/utils.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/msgpack/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/check.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/network/xmlrpc.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/resolvelib/compat/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/_trie/py.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/locators.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/progress_bars.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distro.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treeadapters/sax.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/hashes.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/__about__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/index/sources.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/install/editable_legacy.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/network/utils.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/version.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/req/req_uninstall.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/unpacking.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/charsetgroupprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/wheel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/idna/idnadata.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/fields.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/search.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/resolvelib/reporters.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/vcs/versioncontrol.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/euckrfreq.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/retry.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/adapters.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/network/lazy_wheel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/base_command.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tomli/_re.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/langrussianmodel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/version.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pkg_resources/py31compat.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/escprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/misc.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/main_parser.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/_inputstream.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/scripts.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/cache.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/wait.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/appdirs.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/debug.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/sjisprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/index.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/_utils.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/cache.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/specifiers.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/req/constructors.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/models.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/connection.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/colorama/ansi.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tomli/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/prepare.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/constants.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/build/wheel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/install.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/build.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/legacy/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/appdirs.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/sessions.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/self_outdated_check.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/network/auth.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/metadata/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/tornadoweb.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/locations/_sysconfig.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/_utils.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/utils.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/resolver.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/certifi/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/locations/_distutils.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/compat.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/candidates.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/auth.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/wheel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/msgpack/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/temp_dir.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/utf8prober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/hash.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/main.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/idna/codec.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/status_codes.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/freeze.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/stop.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/datetime.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/timeout.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/urls.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/install/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/util.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/idna/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/metadata.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/serializer.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/idna/package_data.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/langhungarianmodel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/langturkishmodel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/install/wheel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/escsm.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/encoding.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/compat.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/filesystem.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/request.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/network/session.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/request.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/api.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/glibc.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/compat.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/show.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/download.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/markers.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/webencodings/labels.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/tags.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/msgpack/_version.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/etree.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/colorlog.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/colorama/win32.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/_trie/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/requirements.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/distributions/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/_in_process.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/langhebrewmodel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/jpcntx.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/idna/uts46data.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/target_python.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/command_context.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/msgpack/fallback.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/req_command.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/hebrewprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/cmdoptions.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/candidate.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/metadata/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/appengine.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/req/req_file.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/etree.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/euckrprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/_trie/_base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pkg_resources/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/distributions/base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/cookies.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/__version__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/vcs/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/manifest.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/adapter.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/_structures.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/req/req_install.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/network/cache.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/uninstall.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/connectionpool.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/wrapper.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/webencodings/mklabels.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/msgpack/ext.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/autocompletion.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/langbulgarianmodel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/direct_url.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/metadata/base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/cli/chardetect.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/build_env.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/hooks.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/vcs/subversion.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/progress/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/latin1prober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/heuristics.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/chardistribution.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/nap.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/freeze.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/cp949prober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/vcs/bazaar.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/ssl_.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/sbcsgroupprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/resolvelib/resolvers.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/ssltransport.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/main.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/six.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/help.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/caches/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/build/metadata.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/parallel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/response.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/packaging.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/req/req_tracker.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/check.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/version.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/progress/bar.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/dom.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/poolmanager.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/response.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/index/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/_manylinux.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/before.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/compat.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/inject_securetransport.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/parser.py', 'backend/venv39/lib/python3.9/site-packages/pip/__main__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/format_control.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/index.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cache.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tomli/_parser.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/vcs/mercurial.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/colorama/winterm.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/certs.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/whitespace.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/_cmd.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/codingstatemachine.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/help.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/idna/core.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/check.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/filewrapper.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/html5parser.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/controller.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/langgreekmodel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/resolvelib/providers.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/reporter.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/retry.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/distributions/wheel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/lint.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/distutils_args.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/index/package_finder.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/markers.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/mbcsgroupprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/wait.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/serialize.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/_version.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/link.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/_tokenizer.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/cli/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/build/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/virtualenv.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/jisfreq.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/wheel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/idna/intranges.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/socks.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/meta.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/subprocess.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/scheme.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/configuration.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/models.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/_log.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/progress/spinner.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/misc.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/database.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/legacy/resolver.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/completion.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/big5prober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/dom.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/langthaimodel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/connection.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/metadata/languages.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/wheel_builder.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/req/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/packaging/_musllinux.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/before_sleep.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/setuptools_build.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/configuration.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/locations/base.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/util/url.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/gb2312prober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/charsetprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/resolvelib/structs.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/logging.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/requests/packages.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/commands/list.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/status_codes.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/progress/counter.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/compat.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/filepost.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/operations/build/metadata_legacy.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/direct_url_helpers.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/after.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/securetransport.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/optionaltags.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/resolvelib/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/big5freq.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/enums.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/tenacity/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/compatibility_tags.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/models/search_scope.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/wheel.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pep517/dirtools.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/pyparsing.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/utils/deprecation.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/chardet/mbcharsetprober.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/cli/spinners.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/tarfile.py', 'backend/venv39/lib/python3.9/site-packages/pip/_internal/vcs/git.py', 'backend/venv39/lib/python3.9/site-packages/pip/_vendor/urllib3/_collections.py'. Reloading... -Process SpawnProcess-4: -Traceback (most recent call last): - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap - self.run() - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 108, in run - self._target(*self._args, **self._kwargs) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started - target(sockets=sockets) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 61, in run - return asyncio.run(self.serve(sockets=sockets)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 195, in run - return runner.run(main) - ^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run - return self._loop.run_until_complete(task) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 68, in serve - config.load() - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/config.py", line 467, in load - self.loaded_app = import_from_string(self.app) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 24, in import_from_string - raise exc from None - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 21, in import_from_string - module = importlib.import_module(module_str) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/importlib/__init__.py", line 90, in import_module - return _bootstrap._gcd_import(name[level:], package, level) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1310, in _find_and_load_unlocked - File "", line 488, in _call_with_frames_removed - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1324, in _find_and_load_unlocked -ModuleNotFoundError: No module named 'app' -WARNING: WatchFiles detected changes in 'backend/venv39/lib/python3.9/site-packages/h11/_abnf.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_subprocesses.py', 'backend/venv39/lib/python3.9/site-packages/anyio/from_thread.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/ply/cpp.py', 'backend/venv39/lib/python3.9/site-packages/jose/utils.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/streaming.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/config.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/native/encoder.py', 'backend/venv39/lib/python3.9/site-packages/jose/backends/rsa_backend.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/contrib/emscripten/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/deprecated/tools.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_validate_call.py', 'backend/venv39/lib/python3.9/site-packages/h11/_version.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/generics.py', 'backend/venv39/lib/python3.9/site-packages/cffi/_shimmed_dist_utils.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/wsgi.py', 'backend/venv39/lib/python3.9/site-packages/typing_inspection/introspection.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/c_ast.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/base.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/response.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_mock_val_ser.py', 'backend/venv39/lib/python3.9/site-packages/anyio/streams/stapled.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/compat/integer.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_rw_lock.py', 'backend/venv39/lib/python3.9/site-packages/h11/_events.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/mypy.py', 'backend/venv39/lib/python3.9/site-packages/starlette/staticfiles.py', 'backend/venv39/lib/python3.9/site-packages/anyio/lowlevel.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_dataclasses.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/decorator.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_validators.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_core_metadata.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/curves.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_pyecdsa.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/c_generator.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/contrib/emscripten/request.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/types.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/annotated_types.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_signature.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/connectionpool.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/authentication.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_backends/_trio.py', 'backend/venv39/lib/python3.9/site-packages/starlette/status.py', 'backend/venv39/lib/python3.9/site-packages/dotenv/variables.py', 'backend/venv39/lib/python3.9/site-packages/jose/jwt.py', 'backend/venv39/lib/python3.9/site-packages/cffi/error.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/httpsredirect.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_backends/_asyncio.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/validate_call_decorator.py', 'backend/venv39/lib/python3.9/site-packages/idna/codec.py', 'backend/venv39/lib/python3.9/site-packages/cffi/model.py', 'backend/venv39/lib/python3.9/site-packages/idna/compat.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/native/__init__.py', 'backend/venv39/lib/python3.9/site-packages/exceptiongroup/__init__.py', 'backend/venv39/lib/python3.9/site-packages/multidict/_compat.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_docs_extraction.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/mypy.py', 'backend/venv39/lib/python3.9/site-packages/anyio/to_thread.py', 'backend/venv39/lib/python3.9/site-packages/idna/intranges.py', 'backend/venv39/lib/python3.9/site-packages/h11/_state.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_internal_dataclass.py', 'backend/venv39/lib/python3.9/site-packages/starlette/endpoints.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/contrib/emscripten/fetch.py', 'backend/venv39/lib/python3.9/site-packages/anyio/streams/tls.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_import_utils.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/_compat.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/contrib/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_model_construction.py', 'backend/venv39/lib/python3.9/site-packages/dotenv/cli.py', 'backend/venv39/lib/python3.9/site-packages/exceptiongroup/_version.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/tools.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/opentype.py', 'backend/venv39/lib/python3.9/site-packages/typing_inspection/typing_objects.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/contrib/emscripten/connection.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/experimental/arguments_schema.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/yacctab.py', 'backend/venv39/lib/python3.9/site-packages/starlette/templating.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/json.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/parse.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/typing.py', 'backend/venv39/lib/python3.9/site-packages/rsa/parallel.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/_build_tables.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/__init__.py', 'backend/venv39/lib/python3.9/site-packages/starlette/schemas.py', 'backend/venv39/lib/python3.9/site-packages/jose/constants.py', 'backend/venv39/lib/python3.9/site-packages/multidict/_abc.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/config.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/schema.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/der/encoder.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/deprecated/copy_internals.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_fields.py', 'backend/venv39/lib/python3.9/site-packages/yarl/_quoting_py.py', 'backend/venv39/lib/python3.9/site-packages/anyio/functools.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_der.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/compat/__init__.py', 'backend/venv39/lib/python3.9/site-packages/exceptiongroup/_exceptions.py', 'backend/venv39/lib/python3.9/site-packages/rsa/util.py', 'backend/venv39/lib/python3.9/site-packages/rsa/randnum.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/char.py', 'backend/venv39/lib/python3.9/site-packages/anyio/streams/buffered.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/__init__.py', 'backend/venv39/lib/python3.9/site-packages/jose/backends/ecdsa_backend.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_asyncio_selector_thread.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_schema_gather.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/wait.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_jacobi.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/request.py', 'backend/venv39/lib/python3.9/site-packages/jose/backends/native.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/util.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/ber/encoder.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_exceptions.py', 'backend/venv39/lib/python3.9/site-packages/certifi/__init__.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/timeout.py', 'backend/venv39/lib/python3.9/site-packages/idna/uts46data.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_keys.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_resources.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_typedattr.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/der.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/class_validators.py', 'backend/venv39/lib/python3.9/site-packages/anyio/abc/_resources.py', 'backend/venv39/lib/python3.9/site-packages/anyio/abc/_tasks.py', 'backend/venv39/lib/python3.9/site-packages/starlette/types.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_tasks.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/warnings.py', 'backend/venv39/lib/python3.9/site-packages/multidict/_multidict_py.py', 'backend/venv39/lib/python3.9/site-packages/yarl/_parse.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/plugin/__init__.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/rfc6979.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_schema_generation_shared.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_core_utils.py', 'backend/venv39/lib/python3.9/site-packages/cffi/_imp_emulation.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/_rwlock.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/ply/yacc.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_core/__init__.py', 'backend/venv39/lib/python3.9/site-packages/cffi/vengine_gen.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/deprecated/json.py', 'backend/venv39/lib/python3.9/site-packages/rsa/cli.py', 'backend/venv39/lib/python3.9/site-packages/anyio/to_process.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/parse.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/aliases.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/_request_methods.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/datetime_parse.py', 'backend/venv39/lib/python3.9/site-packages/jose/jws.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/json.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/__init__.py', 'backend/venv39/lib/python3.9/site-packages/anyio/pytest_plugin.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/plugin/_loader.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/ber/eoo.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_streams.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/http2/probe.py', 'backend/venv39/lib/python3.9/site-packages/jose/backends/cryptography_backend.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/_hypothesis_plugin.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/experimental/__init__.py', 'backend/venv39/lib/python3.9/site-packages/h11/_util.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/ply/ygen.py', 'backend/venv39/lib/python3.9/site-packages/dotenv/__main__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/validators.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_forward_ref.py', 'backend/venv39/lib/python3.9/site-packages/yarl/_quoting.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/ast_transforms.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_config.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/decorator.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/schema.py', 'backend/venv39/lib/python3.9/site-packages/starlette/convertors.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/contrib/socks.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/ber/decoder.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/alias_generators.py', 'backend/venv39/lib/python3.9/site-packages/h11/_receivebuffer.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/ecdh.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/debug.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/useful.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_curves.py', 'backend/venv39/lib/python3.9/site-packages/h11/_headers.py', 'backend/venv39/lib/python3.9/site-packages/cffi/vengine_cpy.py', 'backend/venv39/lib/python3.9/site-packages/anyio/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_utils.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/datetime_parse.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_known_annotated_metadata.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_serializers.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_eddsa.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_migration.py', 'backend/venv39/lib/python3.9/site-packages/cffi/commontypes.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/_base_connection.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/connection.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_malformed_sigs.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/native/decoder.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/eddsa.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/fields.py', 'backend/venv39/lib/python3.9/site-packages/rsa/key.py', 'backend/venv39/lib/python3.9/site-packages/jose/backends/base.py', 'backend/venv39/lib/python3.9/site-packages/dotenv/__init__.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_sha3.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/der/decoder.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_repr.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/ply/lex.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_git.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/cors.py', 'backend/venv39/lib/python3.9/site-packages/multidict/__init__.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/ssltransport.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/errors.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/namedval.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/trustedhost.py', 'backend/venv39/lib/python3.9/site-packages/yarl/_url.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/networks.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/deprecated/class_validators.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/experimental/missing_sentinel.py', 'backend/venv39/lib/python3.9/site-packages/rsa/transform.py', 'backend/venv39/lib/python3.9/site-packages/anyio/abc/_streams.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/networks.py', 'backend/venv39/lib/python3.9/site-packages/typing_inspection/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/json_schema.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/c_lexer.py', 'backend/venv39/lib/python3.9/site-packages/h11/_writers.py', 'backend/venv39/lib/python3.9/site-packages/anyio/streams/memory.py', 'backend/venv39/lib/python3.9/site-packages/rsa/prime.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/version.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/proxy.py', 'backend/venv39/lib/python3.9/site-packages/starlette/routing.py', 'backend/venv39/lib/python3.9/site-packages/cffi/ffiplatform.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/_collections.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/tagmap.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/env_settings.py', 'backend/venv39/lib/python3.9/site-packages/starlette/background.py', 'backend/venv39/lib/python3.9/site-packages/starlette/requests.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_tempfile.py', 'backend/venv39/lib/python3.9/site-packages/rsa/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/ply/ctokens.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/__init__.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_fileio.py', 'backend/venv39/lib/python3.9/site-packages/starlette/_exception_handler.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/utils.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/gzip.py', 'backend/venv39/lib/python3.9/site-packages/exceptiongroup/_suppress.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/experimental/pipeline.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/annotated_handlers.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/deprecated/decorator.py', 'backend/venv39/lib/python3.9/site-packages/jose/backends/_asn1.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/ber/__init__.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/keys.py', 'backend/venv39/lib/python3.9/site-packages/dotenv/parser.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_signals.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/util.py', 'backend/venv39/lib/python3.9/site-packages/cffi/cffi_opcode.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/c_parser.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/error_wrappers.py', 'backend/venv39/lib/python3.9/site-packages/starlette/applications.py', 'backend/venv39/lib/python3.9/site-packages/_argon2_cffi_bindings/__init__.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/poolmanager.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/http2/__init__.py', 'backend/venv39/lib/python3.9/site-packages/anyio/abc/_subprocesses.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/tag.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/fields.py', 'backend/venv39/lib/python3.9/site-packages/typing_extensions.py', 'backend/venv39/lib/python3.9/site-packages/propcache/_helpers.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/main.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/error.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/validators.py', 'backend/venv39/lib/python3.9/site-packages/starlette/websockets.py', 'backend/venv39/lib/python3.9/site-packages/frozenlist/__init__.py', 'backend/venv39/lib/python3.9/site-packages/propcache/api.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/class_validators.py', 'backend/venv39/lib/python3.9/site-packages/starlette/responses.py', 'backend/venv39/lib/python3.9/site-packages/anyio/abc/_eventloop.py', 'backend/venv39/lib/python3.9/site-packages/anyio/to_interpreter.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/connection.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/lextab.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/deprecated/parse.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/_sha3.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_namespace_utils.py', 'backend/venv39/lib/python3.9/site-packages/certifi/core.py', 'backend/venv39/lib/python3.9/site-packages/cffi/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/errors.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_sockets.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/deprecated/config.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/numbertheory.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/functional_serializers.py', 'backend/venv39/lib/python3.9/site-packages/_argon2_cffi_bindings/_ffi_build.py', 'backend/venv39/lib/python3.9/site-packages/starlette/datastructures.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/__init__.py', 'backend/venv39/lib/python3.9/site-packages/starlette/formparsers.py', 'backend/venv39/lib/python3.9/site-packages/cffi/cparser.py', 'backend/venv39/lib/python3.9/site-packages/dotenv/main.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/ssl_.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/fields.py', 'backend/venv39/lib/python3.9/site-packages/annotated_types/__init__.py', 'backend/venv39/lib/python3.9/site-packages/anyio/streams/text.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/error.py', 'backend/venv39/lib/python3.9/site-packages/cffi/setuptools_ext.py', 'backend/venv39/lib/python3.9/site-packages/cffi/verifier.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/ssl_match_hostname.py', 'backend/venv39/lib/python3.9/site-packages/propcache/__init__.py', 'backend/venv39/lib/python3.9/site-packages/rsa/pkcs1_v2.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/dataclasses.py', 'backend/venv39/lib/python3.9/site-packages/certifi/__main__.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/ecdsa.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/__init__.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_ecdsa.py', 'backend/venv39/lib/python3.9/site-packages/anyio/streams/file.py', 'backend/venv39/lib/python3.9/site-packages/idna/__init__.py', 'backend/venv39/lib/python3.9/site-packages/cffi/lock.py', 'backend/venv39/lib/python3.9/site-packages/starlette/authentication.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/types.py', 'backend/venv39/lib/python3.9/site-packages/dotenv/ipython.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/http2/connection.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/error_wrappers.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_core/core_schema.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_backends/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/root_model.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/jose/backends/__init__.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/sessions.py', 'backend/venv39/lib/python3.9/site-packages/starlette/middleware/__init__.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_synchronization.py', 'backend/venv39/lib/python3.9/site-packages/six.py', 'backend/venv39/lib/python3.9/site-packages/cffi/api.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_eventloop.py', 'backend/venv39/lib/python3.9/site-packages/idna/core.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/errors.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/constraint.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/cer/decoder.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/contrib/emscripten/response.py', 'backend/venv39/lib/python3.9/site-packages/starlette/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/color.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/deprecated/__init__.py', 'backend/venv39/lib/python3.9/site-packages/cffi/recompiler.py', 'backend/venv39/lib/python3.9/site-packages/starlette/config.py', 'backend/venv39/lib/python3.9/site-packages/jose/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/errors.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/filepost.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/plugin/_schema_validator.py', 'backend/venv39/lib/python3.9/site-packages/starlette/_utils.py', 'backend/venv39/lib/python3.9/site-packages/idna/idnadata.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_ellipticcurve.py', 'backend/venv39/lib/python3.9/site-packages/anyio/abc/_testing.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/cer/encoder.py', 'backend/venv39/lib/python3.9/site-packages/starlette/concurrency.py', 'backend/venv39/lib/python3.9/site-packages/h11/_connection.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/contrib/pyopenssl.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/main.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_decorators.py', 'backend/venv39/lib/python3.9/site-packages/anyio/streams/__init__.py', 'backend/venv39/lib/python3.9/site-packages/starlette/testclient.py', 'backend/venv39/lib/python3.9/site-packages/rsa/core.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/typing.py', 'backend/venv39/lib/python3.9/site-packages/rsa/pkcs1.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_decorators_v1.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/_version.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/cer/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/namedtype.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/env_settings.py', 'backend/venv39/lib/python3.9/site-packages/exceptiongroup/_formatting.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_ecdh.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/retry.py', 'backend/venv39/lib/python3.9/site-packages/anyio/abc/_sockets.py', 'backend/venv39/lib/python3.9/site-packages/h11/_readers.py', 'backend/venv39/lib/python3.9/site-packages/yarl/__init__.py', 'backend/venv39/lib/python3.9/site-packages/propcache/_helpers_py.py', 'backend/venv39/lib/python3.9/site-packages/rsa/common.py', 'backend/venv39/lib/python3.9/site-packages/annotated_types/test_cases.py', 'backend/venv39/lib/python3.9/site-packages/anyio/abc/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/functional_validators.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/_ast_gen.py', 'backend/venv39/lib/python3.9/site-packages/yarl/_quoters.py', 'backend/venv39/lib/python3.9/site-packages/rsa/asn1.py', 'backend/venv39/lib/python3.9/site-packages/cffi/backend_ctypes.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/response.py', 'backend/venv39/lib/python3.9/site-packages/cffi/pkgconfig.py', 'backend/venv39/lib/python3.9/site-packages/jose/jwe.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_discriminated_union.py', 'backend/venv39/lib/python3.9/site-packages/jose/jwk.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/ply/__init__.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_testing.py', 'backend/venv39/lib/python3.9/site-packages/idna/package_data.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/utils.py', 'backend/venv39/lib/python3.9/site-packages/urllib3/util/url.py', 'backend/venv39/lib/python3.9/site-packages/h11/__init__.py', 'backend/venv39/lib/python3.9/site-packages/jose/__init__.py', 'backend/venv39/lib/python3.9/site-packages/yarl/_query.py', 'backend/venv39/lib/python3.9/site-packages/dotenv/version.py', 'backend/venv39/lib/python3.9/site-packages/anyio/_core/_contextmanagers.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/type_adapter.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/generics.py', 'backend/venv39/lib/python3.9/site-packages/exceptiongroup/_catch.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/ssh.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/tools.py', 'backend/venv39/lib/python3.9/site-packages/yarl/_path.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_generate_schema.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/base.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_generics.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/dataclasses.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/_internal/_typing_extra.py', 'backend/venv39/lib/python3.9/site-packages/rsa/pem.py', 'backend/venv39/lib/python3.9/site-packages/pycparser/plyparser.py', 'backend/venv39/lib/python3.9/site-packages/starlette/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/type/univ.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/ellipticcurve.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/version.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/test_numbertheory.py', 'backend/venv39/lib/python3.9/site-packages/ecdsa/_version.py', 'backend/venv39/lib/python3.9/site-packages/pydantic/v1/color.py', 'backend/venv39/lib/python3.9/site-packages/pyasn1/codec/der/__init__.py'. Reloading... -Process SpawnProcess-5: -Traceback (most recent call last): - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap - self.run() - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 108, in run - self._target(*self._args, **self._kwargs) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started - target(sockets=sockets) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 61, in run - return asyncio.run(self.serve(sockets=sockets)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 195, in run - return runner.run(main) - ^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run - return self._loop.run_until_complete(task) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 68, in serve - config.load() - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/config.py", line 467, in load - self.loaded_app = import_from_string(self.app) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 24, in import_from_string - raise exc from None - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 21, in import_from_string - module = importlib.import_module(module_str) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/importlib/__init__.py", line 90, in import_module - return _bootstrap._gcd_import(name[level:], package, level) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1310, in _find_and_load_unlocked - File "", line 488, in _call_with_frames_removed - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1324, in _find_and_load_unlocked -ModuleNotFoundError: No module named 'app' -WARNING: WatchFiles detected changes in 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA3_384.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/expression.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/provision.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_async/http11.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/base.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/poly1305.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/properties.py', 'backend/venv39/lib/python3.9/site-packages/attr/_config.py', 'backend/venv39/lib/python3.9/site-packages/click/core.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/mutable.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_CTR.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/visitors.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/hstore.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_KW.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/models.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/base.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_handlers_bcrypt.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/scrypt/_builtin.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/identity.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/mypy/plugin.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Util/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/compat.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/json.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/md4.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/http/flow_control.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/workers.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/instrumentation.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/oracle.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/TupleHash128.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Protocol/SecretSharing.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/mypy/util.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Protocol/HPKE.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/_orm_types.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_context.py', 'backend/venv39/lib/python3.9/site-packages/aiohappyeyeballs/utils.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_import_ECC.py', 'backend/venv39/lib/python3.9/site-packages/attrs/setters.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_kw.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/TurboSHAKE256.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_keccak.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/mypy/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/expression.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/provision.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/_orm_constructors.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/cli/__main__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/array.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/hashes.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/RIPEMD.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Signature/test_pss.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/connectors/aioodbc.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_handlers_argon2.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_ssl.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/pickleable.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/dml.py', 'backend/venv39/lib/python3.9/site-packages/click/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/__init__.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/bindings/openssl/binding.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/declarative/extensions.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/twofactor/totp.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_sync/http2.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/decrepit/ciphers/__init__.py', 'backend/venv39/lib/python3.9/site-packages/attr/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/Salsa20.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_ECC_NIST.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/importer.py', 'backend/venv39/lib/python3.9/site-packages/click/_textwrap.py', 'backend/venv39/lib/python3.9/site-packages/click/_termui_impl.py', 'backend/venv39/lib/python3.9/site-packages/passlib/exc.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_CFB.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/strategies.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/RSA.py', 'backend/venv39/lib/python3.9/site-packages/passlib/ext/django/models.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/ed25519.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_async/connection.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/concurrency.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_crypto_des.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/provision.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/annotation.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/scoping.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/topological.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA.py', 'backend/venv39/lib/python3.9/site-packages/attr/setters.py', 'backend/venv39/lib/python3.9/site-packages/argon2/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Protocol/test_ecdh.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/util.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/cli/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/MD5.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/sha2_crypt.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/scoping.py', 'backend/venv39/lib/python3.9/site-packages/attr/_compat.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/__main__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/mypy/infer.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/ECC.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/entities.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/backports.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/_typing.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/_selectable_constructors.py', 'backend/venv39/lib/python3.9/site-packages/click/testing.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_hosts.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/py3compat.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_kwp.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/exclusions.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/padding.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/base.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Random/random.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/types.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mysqldb.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/dml.py', 'backend/venv39/lib/python3.9/site-packages/attrs/filters.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/number.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/event/base.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/ocsp.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/strategy_options.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/connectors/pyodbc.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/keywrap.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/x448.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA3_256.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/state_changes.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_win32.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_async/connection_pool.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_select.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Signature/pkcs1_15.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/future/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Protocol/test_rfc1751.py', 'backend/venv39/lib/python3.9/site-packages/passlib/ext/django/utils.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/http/httptools_impl.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/decl_api.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/_py_util.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/compat/_ordered_dict.py', 'backend/venv39/lib/python3.9/site-packages/attrs/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_types.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/IO/_PBES.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Signature/PKCS1_v1_5.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/pbkdf2.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/pg_catalog.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Math/_IntegerNative.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Math/_IntegerGMP.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/serialization/pkcs12.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/cSHAKE256.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/server.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/kdf/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/roundup.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA384.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/decor.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/oid.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/ChaCha20_Poly1305.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_utils_pbkdf2.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/ciphers/base.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_ChaCha20_Poly1305.py', 'backend/venv39/lib/python3.9/site-packages/click/decorators.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_cSHAKE.py', 'backend/venv39/lib/python3.9/site-packages/attrs/validators.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/MD4.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/_openssh.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_ext_django_source.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Protocol/test_HPKE.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/pymssql.py', 'backend/venv39/lib/python3.9/site-packages/argon2/low_level.py', 'backend/venv39/lib/python3.9/site-packages/passlib/apps.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/supervisors/multiprocess.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/events.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/HMAC.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Random/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/base.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_TurboSHAKE.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_sequence.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/sha1_crypt.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/ciphers/algorithms.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_sync/connection_pool.py', 'backend/venv39/lib/python3.9/site-packages/attr/_make.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/Counter.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_crypto_digest.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/crud.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_ChaCha20.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/RIPEMD160.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/kdf/scrypt.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_ext_django.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/version.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/_cipheralgorithm.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/_file_system.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA1.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/__main__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/util.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_apps.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/lifespan/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA256.py', 'backend/venv39/lib/python3.9/site-packages/passlib/ext/django/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Signature/test_dss.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/_collections.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/state.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Protocol/DH.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_EKSBlowfish.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/lambdas.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/pool/impl.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/url.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/traversals.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/config.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/plugin/bootstrap.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/ciphers/aead.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/pyodbc.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/schema.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_utils.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/processors.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Util/test_rfc1751.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/sql.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/cursor.py', 'backend/venv39/lib/python3.9/site-packages/argon2/__main__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/PKCS1_v1_5.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/exc.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/loops/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/types.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/middleware/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/selectable.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/PKCS1_OAEP.py', 'backend/venv39/lib/python3.9/site-packages/passlib/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/fshp.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/types.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Util/test_strxor.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_registry.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/deprecations.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_totp.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/supervisors/watchfilesreload.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/json.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/scrypt.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/__init__.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/__main__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_Salsa20.py', 'backend/venv39/lib/python3.9/site-packages/click/globals.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_trace.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_import_RSA.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/dsa.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/bindings/openssl/_conditional.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/django.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA3_512.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/http/auto.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/logging.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/engines.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/bcrypt.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/assertsql.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Math/_IntegerBase.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_KangarooTwelve.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/horizontal_shard.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_cte.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/elements.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_import_Curve25519.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/query.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/KMAC128.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/plugin/plugin_base.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/event/attr.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/_typing.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/tool_support.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/mypy/decl_class.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/serialization/base.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/asn1/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/json.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/pbkdf2.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/_subprocess.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/dml.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/future/engine.py', 'backend/venv39/lib/python3.9/site-packages/async_timeout/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/__init__.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/ec.py', 'backend/venv39/lib/python3.9/site-packages/passlib/hash.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/aiomysql.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/_blowfish/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/_point.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_ctr.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_ecb.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/CAST.py', 'backend/venv39/lib/python3.9/site-packages/annotated_doc/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/declarative/__init__.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_sync/socks_proxy.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/ChaCha20.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/serialization/pkcs7.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_openpgp.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/cmac.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_crypto_builtin_md4.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_backends/base.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/x25519.py', 'backend/venv39/lib/python3.9/site-packages/click/formatting.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/hmac.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/log.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/Padding.py', 'backend/venv39/lib/python3.9/site-packages/attr/_next_gen.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/tox_support.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/DSA.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/utils.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/CMAC.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/utils.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/bindings/openssl/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/automap.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/TupleHash256.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_models.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/backends/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/__init__.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_exceptions.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/attributes.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/path_registry.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/st_common.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_import_Curve448.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA1.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Math/test_modexp.py', 'backend/venv39/lib/python3.9/site-packages/aiohappyeyeballs/impl.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_rowcount.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/supervisors/statreload.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/md5_crypt.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/IO/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_RIPEMD160.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/_py_util.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_cfb.py', 'backend/venv39/lib/python3.9/site-packages/click/parser.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHAKE256.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_sync/connection.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/_edwards.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/asn1.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/plugin/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Util/test_number.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/phpass.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Signature/test_eddsa.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/BLAKE2s.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Math/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_pwd.py', 'backend/venv39/lib/python3.9/site-packages/click/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/pwd.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Math/Primality.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/backends/openssl/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_EAX.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/_md4.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/extensions.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/ext.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/scrypt/_gen_files.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/utils.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Math/test_Numbers.py', 'backend/venv39/lib/python3.9/site-packages/click/shell_completion.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/_py_collections.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/engine.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/kdf/argon2.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_gcm.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/supervisors/basereload.py', 'backend/venv39/lib/python3.9/site-packages/argon2/profiles.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_context_deprecated.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/verification.py', 'backend/venv39/lib/python3.9/site-packages/argon2/_legacy.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/loader.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_import_DSA.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA3_256.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/strategies.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_Blowfish.py', 'backend/venv39/lib/python3.9/site-packages/passlib/totp.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/operators.py', 'backend/venv39/lib/python3.9/site-packages/argon2/_utils.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/cache_key.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/context.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/_types.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/RFC1751.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/decrepit/ciphers/algorithms.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/base.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_handlers_cisco.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/serialization/ssh.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Signature/test_pkcs1_15.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA3_224.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/utils.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/sync.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/types.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_RSA.py', 'backend/venv39/lib/python3.9/site-packages/aiosignal/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/util.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/general_name.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/functions.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/row.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/schema.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/warnings.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/_asymmetric.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/assertions.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/_oid.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/events.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/dh.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_eax.py', 'backend/venv39/lib/python3.9/site-packages/click/_compat.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/mypy/apply.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/Blowfish.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/middleware/asgi2.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/_py_row.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/_blowfish/unrolled.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_insert.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/postgres.py', 'backend/venv39/lib/python3.9/site-packages/passlib/win32.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Protocol/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/loading.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_handlers_django.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/supervisors/__init__.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/kdf/concatkdf.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_handlers.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/des_crypt.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/decl_base.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/dependency.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/DES.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_pkcs1_15.py', 'backend/venv39/lib/python3.9/site-packages/attr/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/orm.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_CAST.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/_elements_constructors.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_backends/__init__.py', 'backend/venv39/lib/python3.9/site-packages/attr/_cmp.py', 'backend/venv39/lib/python3.9/site-packages/attr/_version_info.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/scram.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/connectors/asyncio.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Signature/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/pool/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_crypto_scrypt.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Util/test_Padding.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/backends/openssl/backend.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA256.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/mssql.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_AES.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/Poly1305.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/base.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_async/http_proxy.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/mysql.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/lifespan/on.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_CBC.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA3_384.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/_test_bad_register.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/exc.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/sun_md5_crypt.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/_typing.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/common.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/relationships.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/ranges.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Signature/DSS.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/pg8000.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_backends/trio.py', 'backend/venv39/lib/python3.9/site-packages/passlib/registry.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/_psycopg_common.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/pymysql.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA224.py', 'backend/venv39/lib/python3.9/site-packages/attr/_funcs.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_GCM.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/pyodbc.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/constant_time.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/provision.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/websockets/websockets_impl.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/ciphers/modes.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/loops/asyncio.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/collections.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_backends/auto.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/provision.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/MD2.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/types.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_MD2.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_ECC_Ed25519.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA512.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/events.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/default.py', 'backend/venv39/lib/python3.9/site-packages/bcrypt/__init__.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_backends/sync.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/base.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/serialization/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Math/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/interfaces.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/DES3.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/result.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/sqlite/json.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/typing.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/IO/test_PBES.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/mock.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/__init__.py', 'backend/venv39/lib/python3.9/site-packages/attrs/converters.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_CMAC.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/websockets/wsproto_impl.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/preloaded.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/asymmetric/ed448.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/requirements.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/common.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_MD5.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/utils.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/operators.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/des.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/websockets/websockets_sansio_impl.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_DES.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/descriptor_props.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/binary.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/aioodbc.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/strxor.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_BLAKE2.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/websockets/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_utils_md4.py', 'backend/venv39/lib/python3.9/site-packages/passlib/ext/__init__.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/base.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/events.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/api.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_ARC4.py', 'backend/venv39/lib/python3.9/site-packages/aiohappyeyeballs/_staggered.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/__init__.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_async/__init__.py', 'backend/venv39/lib/python3.9/site-packages/attr/converters.py', 'backend/venv39/lib/python3.9/site-packages/click/utils.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/mypy/names.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/legacy.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Math/test_Primality.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/__main__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/scrypt/_salsa.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/bindings/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Protocol/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Math/_IntegerCustom.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_DSA.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/middleware/wsgi.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/pool/base.py', 'backend/venv39/lib/python3.9/site-packages/attr/filters.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Protocol/test_KDF.py', 'backend/venv39/lib/python3.9/site-packages/passlib/apache.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/name.py', 'backend/venv39/lib/python3.9/site-packages/aiohappyeyeballs/types.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Signature/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_ECC_Ed448.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/result.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/_dml_constructors.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/_py_processors.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/pool/events.py', 'backend/venv39/lib/python3.9/site-packages/attr/validators.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/util.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_async/interfaces.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/reserved_words.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/cd.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Signature/eddsa.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/exc.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/create.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/_raw_api.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/compiler.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_OCB.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/asn1/asn1.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/session.py', 'backend/venv39/lib/python3.9/site-packages/argon2/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_update_delete.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/base.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/type_api.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_ARC2.py', 'backend/venv39/lib/python3.9/site-packages/passlib/context.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/IO/PEM.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/handlers.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_TupleHash.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/base.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_KMAC.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/asyncmy.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Util/test_asn1.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_reflection.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/cisco.py', 'backend/venv39/lib/python3.9/site-packages/aiohappyeyeballs/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHAKE128.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_SIV.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_deprecations.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/TurboSHAKE128.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_HMAC.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_ddl.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/hybrid.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/padding.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/session.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/characteristics.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/middleware/message_logger.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/_montgomery.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/IO/__init__.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/md.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/vector.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_apache.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Math/Numbers.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/associationproxy.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_utils.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/main.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/provision.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/ElGamal.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Random/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mssql/information_schema.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/BLAKE2b.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/cyextension/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/roles.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/ldap_digests.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA512.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/_concurrency_py3k.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/argon2.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/AES.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_CCM.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHAKE.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_ECC_Curve448.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mariadb.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/event/__init__.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_handlers_pbkdf2.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/http/__init__.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_api.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_ElGamal.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/twofactor/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/cymysql.py', 'backend/venv39/lib/python3.9/site-packages/click/_winconsole.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/base.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/dml.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Random/test_random.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Protocol/test_SecretSharing.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/profiling.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_siv.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/queue.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/keccak.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/constant.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/plugin/pytestplugin.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/mypy.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/fixtures/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/unitofwork.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/clsregistry.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/PublicKey/test_ECC_Curve25519.py', 'backend/venv39/lib/python3.9/site-packages/click/termui.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_pkcs1_oaep.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_sync/__init__.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/websockets/auto.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/ARC4.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_OFB.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/lifespan/off.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/kdf/x963kdf.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/__init__.py', 'backend/venv39/lib/python3.9/site-packages/charset_normalizer/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA3_224.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/IO/test_PKCS8.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_backends/mock.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_utils_handlers.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/event/registry.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/naming.py', 'backend/venv39/lib/python3.9/site-packages/click/types.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/schema.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_async/socks_proxy.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/x509/certificate_transparency.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Math/test_modmult.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/loops/auto.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/windows.py', 'backend/venv39/lib/python3.9/site-packages/passlib/tests/test_handlers_scrypt.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/serializer.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/coercions.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/indexable.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Util/test_Counter.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/reflection.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/_curve.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/_compat.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/fernet.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_dialect.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/orderinglist.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/named_types.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/IO/PKCS8.py', 'backend/venv39/lib/python3.9/site-packages/argon2/_password_hasher.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/event/legacy.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/SHA3_512.py', 'backend/venv39/lib/python3.9/site-packages/passlib/utils/compat/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/persistence.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/decrepit/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/engine/interfaces.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/reflection.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/psycopg.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/writeonly.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_sync/interfaces.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/scrypt/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/enumerated.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/KangarooTwelve.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/dictionary.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/_blowfish/_gen_files.py', 'backend/venv39/lib/python3.9/site-packages/annotated_doc/main.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/ddl.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/event/api.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_pkcs1_oaep_decode.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/loops/uvloop.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/ext/baked.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/ARC2.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_async/http2.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/default_comparator.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/util/_has_cy.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/dynamic.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_ccm.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_OpenPGP.py', 'backend/venv39/lib/python3.9/site-packages/passlib/hosts.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/kdf/kbkdf.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Protocol/KDF.py', 'backend/venv39/lib/python3.9/site-packages/passlib/ifc.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/sql/sqltypes.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA384.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/PublicKey/_nist_ecc.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/misc.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_Poly1305.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Util/_cpu_features.py', 'backend/venv39/lib/python3.9/site-packages/passlib/handlers/digests.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_SHA224.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_sync/http11.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/connectors/__init__.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/asyncio.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Signature/pss.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Hash/test_MD4.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/_blowfish/base.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/evaluator.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/des.py', 'backend/venv39/lib/python3.9/site-packages/uvicorn/protocols/http/h11_impl.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/__about__.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/mapped_collection.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_backends/anyio.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/suite/test_results.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/KMAC256.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_synchronization.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_cbc.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/dialects/oracle/oracledb.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_ofb.py', 'backend/venv39/lib/python3.9/site-packages/cryptography/hazmat/primitives/_serialization.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/inspection.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/SelfTest/Cipher/test_DES3.py', 'backend/venv39/lib/python3.9/site-packages/httpcore/_sync/http_proxy.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Signature/PKCS1_PSS.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/testing/config.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Cipher/_mode_ocb.py', 'backend/venv39/lib/python3.9/site-packages/attrs/__init__.py', 'backend/venv39/lib/python3.9/site-packages/Crypto/Hash/cSHAKE128.py', 'backend/venv39/lib/python3.9/site-packages/sqlalchemy/orm/instrumentation.py', 'backend/venv39/lib/python3.9/site-packages/passlib/crypto/digest.py'. Reloading... -Process SpawnProcess-6: -Traceback (most recent call last): - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap - self.run() - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 108, in run - self._target(*self._args, **self._kwargs) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started - target(sockets=sockets) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 61, in run - return asyncio.run(self.serve(sockets=sockets)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 195, in run - return runner.run(main) - ^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run - return self._loop.run_until_complete(task) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 68, in serve - config.load() - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/config.py", line 467, in load - self.loaded_app = import_from_string(self.app) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 24, in import_from_string - raise exc from None - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 21, in import_from_string - module = importlib.import_module(module_str) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/importlib/__init__.py", line 90, in import_module - return _bootstrap._gcd_import(name[level:], package, level) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1310, in _find_and_load_unlocked - File "", line 488, in _call_with_frames_removed - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1324, in _find_and_load_unlocked -ModuleNotFoundError: No module named 'app' -WARNING: WatchFiles detected changes in 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/dialect.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/circuit.py', 'backend/venv39/lib/python3.9/site-packages/redis/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/socket.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/json/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/retry.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/json/commands.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/resp2.py', 'backend/venv39/lib/python3.9/site-packages/redis/auth/token_manager.py', 'backend/venv39/lib/python3.9/site-packages/requests/structures.py', 'backend/venv39/lib/python3.9/site-packages/redis/background.py', 'backend/venv39/lib/python3.9/site-packages/redis/credentials.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/timeseries/commands.py', 'backend/venv39/lib/python3.9/site-packages/redis/event.py', 'backend/venv39/lib/python3.9/site-packages/requests/packages.py', 'backend/venv39/lib/python3.9/site-packages/requests/api.py', 'backend/venv39/lib/python3.9/site-packages/redis/crc.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/failure_detector.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/querystring.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/__init__.py', 'backend/venv39/lib/python3.9/site-packages/requests/compat.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/resp3.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/reducers.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/index_definition.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/aggregation.py', 'backend/venv39/lib/python3.9/site-packages/redis/utils.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/healthcheck.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/command_executor.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/suggestion.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/query.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/timeseries/utils.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/base.py', 'backend/venv39/lib/python3.9/site-packages/redis/sentinel.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/redismodules.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/lock.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/helpers.py', 'backend/venv39/lib/python3.9/site-packages/requests/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/requests/status_codes.py', 'backend/venv39/lib/python3.9/site-packages/redis/http/http_client.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/bf/commands.py', 'backend/venv39/lib/python3.9/site-packages/redis/lock.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/config.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/bf/info.py', 'backend/venv39/lib/python3.9/site-packages/requests/sessions.py', 'backend/venv39/lib/python3.9/site-packages/requests/cookies.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/database.py', 'backend/venv39/lib/python3.9/site-packages/redis/cluster.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/core.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/healthcheck.py', 'backend/venv39/lib/python3.9/site-packages/requests/help.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/helpers.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/http/http_client.py', 'backend/venv39/lib/python3.9/site-packages/redis/backoff.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/retry.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/encoders.py', 'backend/venv39/lib/python3.9/site-packages/redis/http/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/event.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/cluster.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/command_executor.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/json/path.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/client.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/commands.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/failover.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/document.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/client.py', 'backend/venv39/lib/python3.9/site-packages/redis/auth/token.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/sentinel.py', 'backend/venv39/lib/python3.9/site-packages/requests/hooks.py', 'backend/venv39/lib/python3.9/site-packages/requests/__version__.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/failover.py', 'backend/venv39/lib/python3.9/site-packages/redis/connection.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/cluster.py', 'backend/venv39/lib/python3.9/site-packages/requests/models.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/connection.py', 'backend/venv39/lib/python3.9/site-packages/redis/multidb/exception.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/bf/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/vectorset/utils.py', 'backend/venv39/lib/python3.9/site-packages/redis/auth/err.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/json/decoders.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/utils.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/commands.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/_util.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/hiredis.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/timeseries/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/config.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/vectorset/__init__.py', 'backend/venv39/lib/python3.9/site-packages/requests/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/ocsp.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/profile_information.py', 'backend/venv39/lib/python3.9/site-packages/redis/auth/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/client.py', 'backend/venv39/lib/python3.9/site-packages/requests/_internal_utils.py', 'backend/venv39/lib/python3.9/site-packages/redis/_parsers/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/json/_util.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/field.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/sentinel.py', 'backend/venv39/lib/python3.9/site-packages/redis/cache.py', 'backend/venv39/lib/python3.9/site-packages/redis/typing.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/http/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/failure_detector.py', 'backend/venv39/lib/python3.9/site-packages/redis/maint_notifications.py', 'backend/venv39/lib/python3.9/site-packages/redis/data_structure.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/client.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/search/result.py', 'backend/venv39/lib/python3.9/site-packages/requests/utils.py', 'backend/venv39/lib/python3.9/site-packages/redis/__init__.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/database.py', 'backend/venv39/lib/python3.9/site-packages/redis/auth/idp.py', 'backend/venv39/lib/python3.9/site-packages/requests/auth.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/vectorset/commands.py', 'backend/venv39/lib/python3.9/site-packages/requests/certs.py', 'backend/venv39/lib/python3.9/site-packages/requests/adapters.py', 'backend/venv39/lib/python3.9/site-packages/redis/asyncio/multidb/event.py', 'backend/venv39/lib/python3.9/site-packages/redis/commands/timeseries/info.py'. Reloading... -Process SpawnProcess-7: -Traceback (most recent call last): - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap - self.run() - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 108, in run - self._target(*self._args, **self._kwargs) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started - target(sockets=sockets) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 61, in run - return asyncio.run(self.serve(sockets=sockets)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 195, in run - return runner.run(main) - ^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run - return self._loop.run_until_complete(task) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 68, in serve - config.load() - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/config.py", line 467, in load - self.loaded_app = import_from_string(self.app) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 24, in import_from_string - raise exc from None - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 21, in import_from_string - module = importlib.import_module(module_str) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/importlib/__init__.py", line 90, in import_module - return _bootstrap._gcd_import(name[level:], package, level) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1310, in _find_and_load_unlocked - File "", line 488, in _call_with_frames_removed - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1324, in _find_and_load_unlocked -ModuleNotFoundError: No module named 'app' -WARNING: WatchFiles detected changes in 'backend/venv39/lib/python3.9/site-packages/fastapi/logger.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/encoders.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_status_codes.py', 'backend/venv39/lib/python3.9/site-packages/minio/objectlockconfig.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/_websocket/helpers.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/formdata.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/security/oauth2.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/client_ws.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_transports/wsgi.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/http_exceptions.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/payload.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/tcp_helpers.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/connector.py', 'backend/venv39/lib/python3.9/site-packages/minio/replicationconfig.py', 'backend/venv39/lib/python3.9/site-packages/minio/signer.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/templating.py', 'backend/venv39/lib/python3.9/site-packages/minio/xml.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/_websocket/reader_py.py', 'backend/venv39/lib/python3.9/site-packages/minio/deleteobjects.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_main.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/datastructures.py', 'backend/venv39/lib/python3.9/site-packages/minio/error.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/_cookie_helpers.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/worker.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/minio/credentials/providers.py', 'backend/venv39/lib/python3.9/site-packages/httpx/__version__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_middlewares.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/helpers.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/_websocket/__init__.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/dependencies/utils.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/middleware/wsgi.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/http_parser.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/openapi/models.py', 'backend/venv39/lib/python3.9/site-packages/minio/retention.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_request.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/security/utils.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/json.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/_compat/shared.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/client_reqrep.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/dotenv.py', 'backend/venv39/lib/python3.9/site-packages/python_multipart/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/_websocket/reader.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/pytest_plugin.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/testclient.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/staticfiles.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/middleware/httpsredirect.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/gcp.py', 'backend/venv39/lib/python3.9/site-packages/minio/sseconfig.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/tracing.py', 'backend/venv39/lib/python3.9/site-packages/httpx/__init__.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/openapi/docs.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/_range.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/openapi/constants.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/concurrency.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/extras.py', 'backend/venv39/lib/python3.9/site-packages/minio/helpers.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/errorcodes.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/multipart/decoders.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/dependencies/models.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/compression_utils.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/extensions.py', 'backend/venv39/lib/python3.9/site-packages/minio/commonconfig.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_client.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/security/base.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/__init__.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/pool.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/hdrs.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/version.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_urlparse.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_models.py', 'backend/venv39/lib/python3.9/site-packages/minio/select.py', 'backend/venv39/lib/python3.9/site-packages/minio/minioadmin.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/pyproject.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/tz.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/requests.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/log.py', 'backend/venv39/lib/python3.9/site-packages/python_multipart/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_auth.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/__main__.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/security/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_app.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/middleware/gzip.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_exceptions.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_transports/default.py', 'backend/venv39/lib/python3.9/site-packages/minio/lifecycleconfig.py', 'backend/venv39/lib/python3.9/site-packages/minio/tagging.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/http_writer.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_decoders.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/__init__.py', 'backend/venv39/lib/python3.9/site-packages/minio/crypto.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/routing.py', 'backend/venv39/lib/python3.9/site-packages/python_multipart/decoders.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/_websocket/writer.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/types.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_api.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/streams.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_protocol.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/openapi/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/env.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_content.py', 'backend/venv39/lib/python3.9/site-packages/minio/notificationconfig.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/client_exceptions.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/_compat/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/multipart.py', 'backend/venv39/lib/python3.9/site-packages/minio/api.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/_compat/v2.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/base_protocol.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_urls.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/aws.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_exceptions.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/background.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/main.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/utils.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/exception_handlers.py', 'backend/venv39/lib/python3.9/site-packages/minio/datatypes.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/client_proto.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/applications.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_transports/mock.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/cli.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/dependencies/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/http_websocket.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/yaml.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/middleware/trustedhost.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/utils.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/_ipaddress.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/_websocket/models.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/__init__.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/secrets.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/errors.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/_websocket/reader_c.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_response.py', 'backend/venv39/lib/python3.9/site-packages/multipart/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_fileresponse.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/payload_streamer.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/types.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_transports/base.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/cli.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_transports/asgi.py', 'backend/venv39/lib/python3.9/site-packages/minio/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/http.py', 'backend/venv39/lib/python3.9/site-packages/minio/versioningconfig.py', 'backend/venv39/lib/python3.9/site-packages/minio/legalhold.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_types.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_log.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/azure.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/cookiejar.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/security/api_key.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/param_functions.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/middleware/__init__.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/client.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_runner.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_ws.py', 'backend/venv39/lib/python3.9/site-packages/minio/credentials/__init__.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/security/open_id_connect_url.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/providers/toml.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_urldispatcher.py', 'backend/venv39/lib/python3.9/site-packages/minio/time.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/test_utils.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/client_middlewares.py', 'backend/venv39/lib/python3.9/site-packages/minio/credentials/credentials.py', 'backend/venv39/lib/python3.9/site-packages/multipart/multipart.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/utils.py', 'backend/venv39/lib/python3.9/site-packages/minio/sse.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_multipart.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/abc.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/middleware/cors.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_config.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_server.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/security/http.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/openapi/utils.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_utils.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/params.py', 'backend/venv39/lib/python3.9/site-packages/python_multipart/multipart.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/sql.py', 'backend/venv39/lib/python3.9/site-packages/httpx/_transports/__init__.py', 'backend/venv39/lib/python3.9/site-packages/multipart/exceptions.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/typedefs.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/web_routedef.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/client_middleware_digest_auth.py', 'backend/venv39/lib/python3.9/site-packages/aiohttp/resolver.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/websockets.py', 'backend/venv39/lib/python3.9/site-packages/pydantic_settings/sources/base.py', 'backend/venv39/lib/python3.9/site-packages/psycopg2/_json.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py', 'backend/venv39/lib/python3.9/site-packages/fastapi/responses.py'. Reloading... -Process SpawnProcess-8: -Traceback (most recent call last): - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 314, in _bootstrap - self.run() - File "/opt/miniconda3/lib/python3.12/multiprocessing/process.py", line 108, in run - self._target(*self._args, **self._kwargs) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started - target(sockets=sockets) - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 61, in run - return asyncio.run(self.serve(sockets=sockets)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 195, in run - return runner.run(main) - ^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/asyncio/runners.py", line 118, in run - return self._loop.run_until_complete(task) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/server.py", line 68, in serve - config.load() - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/config.py", line 467, in load - self.loaded_app = import_from_string(self.app) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 24, in import_from_string - raise exc from None - File "/Users/duguoyou/.local/lib/python3.12/site-packages/uvicorn/importer.py", line 21, in import_from_string - module = importlib.import_module(module_str) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/miniconda3/lib/python3.12/importlib/__init__.py", line 90, in import_module - return _bootstrap._gcd_import(name[level:], package, level) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1310, in _find_and_load_unlocked - File "", line 488, in _call_with_frames_removed - File "", line 1387, in _gcd_import - File "", line 1360, in _find_and_load - File "", line 1324, in _find_and_load_unlocked -ModuleNotFoundError: No module named 'app' -INFO: Stopping reloader process [35671] diff --git a/backend/app/main.py b/backend/app/main.py index d9d8e86..38072ab 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -4,7 +4,7 @@ from fastapi.middleware.trustedhost import TrustedHostMiddleware from app.config.settings import settings from app.models.database import engine, Base -from app.routes import user, api_key, algorithm, openai, gateway, services, data_management, monitoring, permissions, history, deployment, gitea, repositories +from app.routes import user, algorithm, openai, gateway, services, data_management, monitoring, permissions, history, deployment, gitea, repositories # 创建数据库表 Base.metadata.create_all(bind=engine) @@ -37,7 +37,6 @@ app.add_middleware( # 注册路由 app.include_router(user.router, prefix=settings.API_V1_STR) -app.include_router(api_key.router, prefix=settings.API_V1_STR) app.include_router(algorithm.router, prefix=settings.API_V1_STR) app.include_router(openai.router, prefix=settings.API_V1_STR) app.include_router(gateway.router, prefix=settings.API_V1_STR) diff --git a/backend/app/models/__pycache__/models.cpython-312.pyc b/backend/app/models/__pycache__/models.cpython-312.pyc index 5d169cf468851f8b3899c6f4db283cd2072a6038..9c3846cf8a137b30890e8c17f7de8abfd86f5f43 100644 GIT binary patch delta 2977 zcma)8Yitx%6rS1ctF!O-Zg;zFDHWy#tZk*0mPdKCm1-##RBB9Fm=PAY-FjyiQcUa; ztEnQfaQy)hAH+m!*dJ((Hk$Z|AtCXHO;{3`pC&wFObkhXnE1zY?sT`yQcE}4Z)VOt zbMLw5JLkJ|wezEH`)@Xzz`^hJ!;|qf)o1NNe$!WLOnh56C;28g$uB!Dm*F_a4F+|b zY?0hjKni9 z+fc2s#E~S4r;ZK}#U-+ZzHH8jPvB@1LNkIDVHLuY2pbVtIBhe=@^YSUrA{HL`;()w zaJN`4nX=}~I`Dztpa2;#uq>2i%P;eq6`rlfD(EM!aGg-_v@h>T-`5G_4)AeGR>_vN z7v6J?IYg(be=eDj(-`QzFV5Y2=j%Jumu`Q2S~Uu<<15bWdYs0DumPbQ!G^FzW>rHPR#J-7ik`iB zz*m$Mz=VmrrT5?ThH2E`_j|7xX7}YR+cP_Fxr67upOT!rKGRG01{wpI-S>^0Ep*<0 z#hA0Up4z36)r+;m_tS&n-E>T7*v42f=Q)uK5;CNRb>KH>MK)xkB!JbDuiQb~0!MbR zT4|lV-Jspc_V$C$tgFC@7yLX>_qrmRZ_Fcl$sU-T(RBBN={u9(X*7|&U|k@IJPY?E z0C3XG$lCx_>4Qi5UZ|pjmAW4DrIkJ=sZaE;h!+~N)(&blZ^D_e+#7MRW!ce6z90RH z>K-3)D-5>6jWR>2wa07sPCb8Na9X%t**q&>YsuOBGu`y>iXBm4qiWWlvu?}mx@8HR zH%_0(Sz1r+)R@`Bx>|8w=lMF??QV6SG_#U`t#`4#lXiOAUCnpUth;7_t;-sbb-xqC zr~&8`t5%c;^k@pBP$Ea5x=im0&fHlKy|3 zS}RsE9emo zpyT=Tmnk-m6xrBGD?7kD7W9l4kGPQjhg9FqtRC5$wHD^}p$-0ih{LuRThS_kM|$Ab zkpU}~O+x=Misvc?Te$c=G}7-~LNo%_O35j?vhG3*QFfxFAs4Qv4w8Wv$$Rj6UqJ=tIv7)NNf&9uKs7zkXtRPWevBp&U;&;|aY*;3! znX3M1Qb`d!bXEOmlB85qY&1TUCJF6ivS1{g^xw*+B?b664wt9}rh_0{gui0o=}XZD zzr#26%7tTdV#oF9=4<-7eJ|!52QoeMt?0LF^WO^5Ss`cLk^fd;v!Jwhkzv3-v4ZZe zn(SrYB<%cQ>dxeq$rG!5_EG}eOJY*Z9m7c}oshSXNf<@tQ9h@&)onow-!|DY&%tFr z;?VBlGG9;A)%7h_zK5TJQM}Gaef&;-DmBmH^?nlu(*01f9#RN#q zBrzu2J}=Nj-AqhSNT#VqVvLCwOHA~F#V(O^VZ0fO-WU@u3|GGIcUt~riYGbG`Of>j z-{14T@AJKX>R#CTgT-Rv;Q6rq&DdX6H?2NC^m#)mUn2{WQ*uk574LEh_H&$UpY*9M zj+^m`{@fIw)VQ~t(RjSMT9V^(Ms7)x)aB^(C-nD{X1*@x)qcVA-MJri=QQKTU?_PK zp#eZCy(*J*EIBQnv?Aa>6>~KHQj)|nmlKmQi44%RVNUGC z-XjP{5zGiR2*(k+5V{e1a+O9SuV?Kby|4505nAnSr@xpZ9g;yRSuqyRIw5E{Stsiy z(;llCt?*jFD$s8 zEK{`4rDc-EeLs3bSYZ=C4Tyy+Z$2z;d9SCE6Nv**`NUdr1h=7!hJzQw?*CvP5@KdA=hEDOdE1Y>|U={;2? zk{%c~ENfvdcqUB9GDJfU5z^3bg-b9k^J<@@r+2)r3IY7h+e}*vQ89znL|?G<>eSXp zmfl$nL}Z73hv+01V5Y1M04RNU_xf+QK34fB<6yf;oPb*fJ{>dl;Muk)$ zU||qHLKQ*)fiZ#^zb78Ehe`5MTn+MDDFMDo8_tHYQB3k{sTh&dlhKSCvBw3AoX0V{ zG9Q2OoWzYd2yc1`;0;Jjz2|DJgZ#LO)cy4Q#va6B2DLgm0&cb&zFNkxIb%*y| z!%`^kYg?_$I|k-X)3|QX331dfUCRqS^ARw4ckvV-$1{19B(C;V37i4C!l%F zy;Hsg1wc|&Ci`f}860J_vBG6)VTVy92rwcB4wcpDk4ix%5W;lP8T8?KNd!O8(z9Yi>4w1ka67-S(fqIAptNl+4LhPT_LCuzKSF*8C z`8rU8V$~MaV7INP*Sl>@twF1I+n6$dlI*tG3TqfqEoQfuX3{P@Wao;oy);TVUI1lG zZi*6wQdQiX`#(KA2YG!1rv^rq&me1HkyJ8O)FTpXHT#dab z(}h6iEYl>WPVBlUO=ps+lq{*b)Q7Y)t=d+o5wYU1xuBRpkZ>WqbTJzg>rNq0M-ws` z;OLd=DuE@1fNKp>THVpIuekQ*!mH?r@HV{ZUum1MlKO&n+8_L~eEzhmDa;2;afrME z2nkFpYZiu>OrVyj_Z}+^mRig|g&lhrQw&chl2SG<_mS(+i?K_;NB^klD!1`re&NU_ zhu_VRmG51+xXHn1vxfH9Hr6}%A^t{Ylf&C%RbQ- diff --git a/backend/app/models/models.py b/backend/app/models/models.py index 1dad399..6cdd634 100644 --- a/backend/app/models/models.py +++ b/backend/app/models/models.py @@ -46,6 +46,20 @@ class AlgorithmVersion(Base): calls = relationship("AlgorithmCall", back_populates="version") +class Role(Base): + """角色模型""" + __tablename__ = "roles" + + id = Column(String, primary_key=True, index=True) + name = Column(String, unique=True, nullable=False, index=True) # admin, user + description = Column(Text, default="") + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + # 关系 + users = relationship("User", back_populates="role") + + class User(Base): """用户模型""" __tablename__ = "users" @@ -54,31 +68,17 @@ class User(Base): username = Column(String, unique=True, nullable=False, index=True) email = Column(String, unique=True, nullable=False, index=True) password_hash = Column(String, nullable=False) - role = Column(String, default="user", index=True) # admin, user, customer + role_id = Column(String, ForeignKey("roles.id"), nullable=False, index=True) status = Column(String, default="active", index=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) # 关系 - api_keys = relationship("APIKey", back_populates="user", cascade="all, delete-orphan") calls = relationship("AlgorithmCall", back_populates="user") + role = relationship("Role", back_populates="users") + -class APIKey(Base): - """API密钥模型""" - __tablename__ = "api_keys" - - id = Column(String, primary_key=True, index=True) - user_id = Column(String, ForeignKey("users.id"), nullable=False, index=True) - key = Column(String, unique=True, nullable=False, index=True) - name = Column(String, nullable=False) - expires_at = Column(DateTime(timezone=True), nullable=False) - status = Column(String, default="active", index=True) - created_at = Column(DateTime(timezone=True), server_default=func.now()) - updated_at = Column(DateTime(timezone=True), onupdate=func.now()) - - # 关系 - user = relationship("User", back_populates="api_keys") class AlgorithmCall(Base): @@ -138,12 +138,28 @@ class AlgorithmRepository(Base): algorithm = relationship("Algorithm", back_populates="repository", uselist=False) +class ServiceGroup(Base): + """服务分组模型""" + __tablename__ = "service_groups" + + id = Column(String, primary_key=True, index=True) + name = Column(String, nullable=False, unique=True, index=True) # 分组名称 + description = Column(Text, default="") # 分组描述 + status = Column(String, default="active", index=True) # 状态 + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + # 关系 + services = relationship("AlgorithmService", back_populates="group") + + class AlgorithmService(Base): """算法服务模型""" __tablename__ = "algorithm_services" id = Column(String, primary_key=True, index=True) service_id = Column(String, unique=True, nullable=False, index=True) # 服务ID + group_id = Column(String, ForeignKey("service_groups.id"), nullable=True, index=True) # 分组ID name = Column(String, nullable=False, index=True) # 服务名称 algorithm_name = Column(String, nullable=False) # 算法名称 version = Column(String, nullable=False) # 版本 @@ -156,6 +172,9 @@ class AlgorithmService(Base): last_heartbeat = Column(DateTime(timezone=True), nullable=True) # 最后心跳时间 created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + # 关系 + group = relationship("ServiceGroup", back_populates="services") # 添加Algorithm模型的repository关系 diff --git a/backend/app/routes/__init__.py b/backend/app/routes/__init__.py index 60de836..285743e 100644 --- a/backend/app/routes/__init__.py +++ b/backend/app/routes/__init__.py @@ -1,12 +1,11 @@ from fastapi import APIRouter -from app.routes import user, algorithm, api_key, history, gateway, monitoring, openai, deployment +from app.routes import user, algorithm, history, gateway, monitoring, openai, deployment api_router = APIRouter() # 注册路由 api_router.include_router(user.router, prefix="/users", tags=["users"]) api_router.include_router(algorithm.router, prefix="/algorithms", tags=["algorithms"]) -api_router.include_router(api_key.router, prefix="/api-keys", tags=["api-keys"]) api_router.include_router(history.router, prefix="/history", tags=["history"]) api_router.include_router(gateway.router, prefix="/gateway", tags=["gateway"]) api_router.include_router(monitoring.router, prefix="/monitoring", tags=["monitoring"]) diff --git a/backend/app/routes/api_key.py b/backend/app/routes/api_key.py deleted file mode 100644 index c7594d6..0000000 --- a/backend/app/routes/api_key.py +++ /dev/null @@ -1,88 +0,0 @@ -from fastapi import APIRouter, Depends, HTTPException, status -from sqlalchemy.orm import Session -from typing import List - -from app.models.database import get_db -from app.schemas.user import APIKeyCreate, APIKeyResponse, APIKeyListResponse -from app.models.models import APIKey -from app.services.user import APIKeyService -from app.dependencies import get_current_active_user - -# 创建路由器 -router = APIRouter(prefix="/api-keys", tags=["api-keys"]) - - -@router.post("", response_model=APIKeyResponse) -async def create_api_key( - api_key_create: APIKeyCreate, - current_user: dict = Depends(get_current_active_user), - db: Session = Depends(get_db) -): - """创建API密钥""" - # 只有管理员或用户本人可以为自己创建API密钥 - if current_user.role != "admin" and current_user.id != api_key_create.user_id: - raise HTTPException(status_code=403, detail="Not enough permissions") - - # 创建API密钥 - api_key = APIKeyService.create_api_key(db, api_key_create) - - return api_key - - -@router.get("", response_model=APIKeyListResponse) -async def get_api_keys( - current_user: dict = Depends(get_current_active_user), - db: Session = Depends(get_db) -): - """获取API密钥列表""" - # 管理员可以查看所有API密钥,普通用户只能查看自己的 - if current_user.role == "admin": - # 这里可以添加分页和过滤,暂时返回所有 - api_keys = db.query(APIKey).all() - else: - api_keys = APIKeyService.get_api_keys_by_user_id(db, current_user.id) - - return {"api_keys": api_keys, "total": len(api_keys)} - - -@router.get("/{api_key_id}", response_model=APIKeyResponse) -async def get_api_key( - api_key_id: str, - current_user: dict = Depends(get_current_active_user), - db: Session = Depends(get_db) -): - """获取API密钥详情""" - # 获取API密钥 - api_key = APIKeyService.get_api_key_by_id(db, api_key_id) - if not api_key: - raise HTTPException(status_code=404, detail="API key not found") - - # 管理员可以查看所有API密钥,普通用户只能查看自己的 - if current_user.role != "admin" and current_user.id != api_key.user_id: - raise HTTPException(status_code=403, detail="Not enough permissions") - - return api_key - - -@router.delete("/{api_key_id}", response_model=dict) -async def revoke_api_key( - api_key_id: str, - current_user: dict = Depends(get_current_active_user), - db: Session = Depends(get_db) -): - """撤销API密钥""" - # 获取API密钥 - api_key = APIKeyService.get_api_key_by_id(db, api_key_id) - if not api_key: - raise HTTPException(status_code=404, detail="API key not found") - - # 管理员可以撤销所有API密钥,普通用户只能撤销自己的 - if current_user.role != "admin" and current_user.id != api_key.user_id: - raise HTTPException(status_code=403, detail="Not enough permissions") - - # 撤销API密钥 - result = APIKeyService.revoke_api_key(db, api_key_id) - if not result: - raise HTTPException(status_code=400, detail="Failed to revoke API key") - - return {"message": "API key revoked successfully"} diff --git a/backend/app/routes/permissions.py b/backend/app/routes/permissions.py index c9c0c29..f518ffd 100644 --- a/backend/app/routes/permissions.py +++ b/backend/app/routes/permissions.py @@ -243,22 +243,3 @@ async def get_user_role_based_permissions( } -@router.get("/check-api-key-access") -async def check_api_key_access( - api_key_value: str, - algorithm_id: str, - current_user: dict = Depends(get_current_active_user), - db = Depends(get_db) -): - """检查API密钥对算法的访问权限""" - # 只有管理员可以检查任意API密钥的权限 - if current_user.get("role") != "admin": - raise HTTPException(status_code=403, detail="Only admins can check API key access") - - has_access = permission_manager.check_api_key_access(db, api_key_value, algorithm_id) - - return { - "api_key_valid": True, # 如果到达这里,说明API密钥存在且活跃 - "has_algorithm_access": has_access, - "algorithm_id": algorithm_id - } \ No newline at end of file diff --git a/backend/app/routes/repositories.py b/backend/app/routes/repositories.py index dcdbe51..04f1d58 100644 --- a/backend/app/routes/repositories.py +++ b/backend/app/routes/repositories.py @@ -8,6 +8,7 @@ import uuid from app.models.models import AlgorithmRepository from app.models.database import SessionLocal from app.routes.user import get_current_active_user +from app.schemas.user import UserResponse from app.gitea.service import gitea_service router = APIRouter(prefix="/repositories", tags=["repositories"]) @@ -38,11 +39,11 @@ class UpdateRepositoryRequest(BaseModel): @router.post("", status_code=status.HTTP_201_CREATED) async def create_repository( request: CreateRepositoryRequest, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """创建算法仓库""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -92,11 +93,11 @@ async def create_repository( @router.get("") async def list_repositories( algorithm_id: Optional[str] = None, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """获取算法仓库列表""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -139,11 +140,11 @@ async def list_repositories( @router.get("/{repo_id}") async def get_repository( repo_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """获取单个算法仓库""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -179,11 +180,11 @@ async def get_repository( async def update_repository( repo_id: str, request: UpdateRepositoryRequest, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """更新算法仓库""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -239,11 +240,11 @@ async def update_repository( @router.delete("/{repo_id}") async def delete_repository( repo_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """删除算法仓库""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 diff --git a/backend/app/routes/services.py b/backend/app/routes/services.py index 4ea4c43..454f637 100644 --- a/backend/app/routes/services.py +++ b/backend/app/routes/services.py @@ -6,9 +6,10 @@ from pydantic import BaseModel import uuid import os -from app.models.models import AlgorithmService +from app.models.models import AlgorithmService, ServiceGroup, AlgorithmRepository from app.models.database import SessionLocal from app.routes.user import get_current_active_user +from app.schemas.user import UserResponse from app.services.project_analyzer import ProjectAnalyzer from app.services.service_generator import ServiceGenerator from app.services.service_orchestrator import ServiceOrchestrator @@ -83,6 +84,46 @@ class RepositoryAlgorithmsResponse(BaseModel): algorithms: List[Dict[str, Any]] +class ServiceGroupRequest(BaseModel): + """服务分组请求""" + name: str + description: str = "" + + +class ServiceGroupResponse(BaseModel): + """服务分组响应""" + id: str + name: str + description: str + status: str + created_at: str + updated_at: str + + +class ServiceGroupListResponse(BaseModel): + """服务分组列表响应""" + success: bool + groups: List[ServiceGroupResponse] + + +class ServiceGroupDetailResponse(BaseModel): + """服务分组详情响应""" + success: bool + group: ServiceGroupResponse + + +class BatchOperationRequest(BaseModel): + """批量操作请求""" + service_ids: List[str] + + +class BatchOperationResponse(BaseModel): + """批量操作响应""" + success: bool + message: str + results: List[Dict[str, Any]] + + # 初始化服务组件 project_analyzer = ProjectAnalyzer() service_generator = ServiceGenerator() @@ -92,19 +133,23 @@ service_orchestrator = ServiceOrchestrator() @router.post("/register", status_code=status.HTTP_201_CREATED) async def register_service( request: RegisterServiceRequest, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """注册新服务""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 db = SessionLocal() try: # 1. 获取仓库信息 - # 注意:在实际实现中,应该从数据库中获取仓库信息 - # 这里简化处理,假设仓库存在 + repo = db.query(AlgorithmRepository).filter(AlgorithmRepository.id == request.repository_id).first() + if not repo: + raise HTTPException(status_code=404, detail="仓库不存在") + + # 记录仓库信息 + print(f"仓库信息: {repo.name}, {repo.description}, {repo.repo_url}") # 2. 分析项目 repo_path = f"/tmp/repository_{request.repository_id}" @@ -157,7 +202,7 @@ def main(data): id=str(uuid.uuid4()), service_id=service_id, name=request.name, - algorithm_name="algorithm", # 注意:在实际实现中,应该从仓库信息中获取 + algorithm_name=repo.name, # 使用仓库名称作为算法名称 version=request.version, host=request.host, port=request.port, @@ -200,11 +245,11 @@ def main(data): @router.get("", response_model=ServiceListResponse) async def list_services( - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """获取服务列表""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -241,11 +286,11 @@ async def list_services( @router.get("/{service_id}", response_model=ServiceDetailResponse) async def get_service( service_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """获取服务详情""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -281,11 +326,11 @@ async def get_service( @router.post("/{service_id}/start") async def start_service( service_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """启动服务""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -325,11 +370,11 @@ async def start_service( @router.post("/{service_id}/stop") async def stop_service( service_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """停止服务""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -369,11 +414,11 @@ async def stop_service( @router.post("/{service_id}/restart") async def restart_service( service_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """重启服务""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -413,11 +458,11 @@ async def restart_service( @router.delete("/{service_id}") async def delete_service( service_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """删除服务""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -456,11 +501,11 @@ async def delete_service( @router.get("/{service_id}/status") async def get_service_status( service_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """获取服务状态""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -496,11 +541,11 @@ async def get_service_status( async def get_service_logs( service_id: str, lines: int = 100, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """获取服务日志""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") # 创建数据库会话 @@ -534,11 +579,11 @@ async def get_service_logs( @router.get("/repository/algorithms") async def get_repository_algorithms( repository_id: str, - current_user: dict = Depends(get_current_active_user) + current_user: UserResponse = Depends(get_current_active_user) ): """获取仓库中的算法列表""" # 检查用户权限 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Insufficient permissions") try: @@ -567,3 +612,453 @@ async def get_repository_algorithms( ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) + + +# 服务分组管理API + +@router.post("/groups", status_code=status.HTTP_201_CREATED) +async def create_service_group( + request: ServiceGroupRequest, + current_user: UserResponse = Depends(get_current_active_user) +): + """创建服务分组""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + # 生成唯一ID + group_id = str(uuid.uuid4()) + + # 创建分组实例 + group = ServiceGroup( + id=group_id, + name=request.name, + description=request.description + ) + + # 保存到数据库 + db.add(group) + db.commit() + db.refresh(group) + + return { + "success": True, + "message": "服务分组创建成功", + "group": { + "id": group.id, + "name": group.name, + "description": group.description, + "status": group.status, + "created_at": group.created_at.isoformat(), + "updated_at": group.updated_at.isoformat() + } + } + finally: + db.close() + + +@router.get("/groups", response_model=ServiceGroupListResponse) +async def list_service_groups( + current_user: UserResponse = Depends(get_current_active_user) +): + """获取服务分组列表""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + # 查询分组列表 + groups = db.query(ServiceGroup).all() + + # 转换为响应格式 + group_list = [] + for group in groups: + group_list.append(ServiceGroupResponse( + id=group.id, + name=group.name, + description=group.description, + status=group.status, + created_at=group.created_at.isoformat(), + updated_at=group.updated_at.isoformat() + )) + + return ServiceGroupListResponse( + success=True, + groups=group_list + ) + finally: + db.close() + + +@router.get("/groups/{group_id}", response_model=ServiceGroupDetailResponse) +async def get_service_group( + group_id: str, + current_user: UserResponse = Depends(get_current_active_user) +): + """获取服务分组详情""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + # 查询分组 + group = db.query(ServiceGroup).filter(ServiceGroup.id == group_id).first() + + if not group: + raise HTTPException(status_code=404, detail="Service group not found") + + return ServiceGroupDetailResponse( + success=True, + group=ServiceGroupResponse( + id=group.id, + name=group.name, + description=group.description, + status=group.status, + created_at=group.created_at.isoformat(), + updated_at=group.updated_at.isoformat() + ) + ) + finally: + db.close() + + +@router.put("/groups/{group_id}") +async def update_service_group( + group_id: str, + request: ServiceGroupRequest, + current_user: UserResponse = Depends(get_current_active_user) +): + """更新服务分组""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + # 查询分组 + group = db.query(ServiceGroup).filter(ServiceGroup.id == group_id).first() + + if not group: + raise HTTPException(status_code=404, detail="Service group not found") + + # 更新分组信息 + group.name = request.name + group.description = request.description + + # 保存到数据库 + db.commit() + db.refresh(group) + + return { + "success": True, + "message": "服务分组更新成功", + "group": { + "id": group.id, + "name": group.name, + "description": group.description, + "status": group.status, + "created_at": group.created_at.isoformat(), + "updated_at": group.updated_at.isoformat() + } + } + finally: + db.close() + + +@router.delete("/groups/{group_id}") +async def delete_service_group( + group_id: str, + current_user: UserResponse = Depends(get_current_active_user) +): + """删除服务分组""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + # 查询分组 + group = db.query(ServiceGroup).filter(ServiceGroup.id == group_id).first() + + if not group: + raise HTTPException(status_code=404, detail="Service group not found") + + # 检查分组是否有服务 + services_count = db.query(AlgorithmService).filter(AlgorithmService.group_id == group_id).count() + if services_count > 0: + raise HTTPException(status_code=400, detail=f"该分组下还有{services_count}个服务,无法删除") + + # 删除分组 + db.delete(group) + db.commit() + + return { + "success": True, + "message": "服务分组删除成功", + "group_id": group_id + } + finally: + db.close() + + +# 批量服务操作API + +@router.post("/batch/start") +async def batch_start_services( + request: BatchOperationRequest, + current_user: UserResponse = Depends(get_current_active_user) +): + """批量启动服务""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + results = [] + success_count = 0 + + for service_id in request.service_ids: + # 查询服务 + service = db.query(AlgorithmService).filter(AlgorithmService.service_id == service_id).first() + + if not service: + results.append({ + "service_id": service_id, + "success": False, + "message": "服务不存在" + }) + continue + + # 获取容器ID + container_id = service.config.get("container_id") + if not container_id: + results.append({ + "service_id": service_id, + "success": False, + "message": "容器ID不存在" + }) + continue + + # 启动服务 + start_result = service_orchestrator.start_service(service_id, container_id) + if start_result["success"]: + # 更新服务状态 + service.status = start_result["status"] + db.commit() + success_count += 1 + results.append({ + "service_id": service_id, + "success": True, + "message": "服务启动成功" + }) + else: + results.append({ + "service_id": service_id, + "success": False, + "message": f"服务启动失败: {start_result['error']}" + }) + + return BatchOperationResponse( + success=True, + message=f"批量启动完成,成功{success_count}个,失败{len(request.service_ids) - success_count}个", + results=results + ) + finally: + db.close() + + +@router.post("/batch/stop") +async def batch_stop_services( + request: BatchOperationRequest, + current_user: UserResponse = Depends(get_current_active_user) +): + """批量停止服务""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + results = [] + success_count = 0 + + for service_id in request.service_ids: + # 查询服务 + service = db.query(AlgorithmService).filter(AlgorithmService.service_id == service_id).first() + + if not service: + results.append({ + "service_id": service_id, + "success": False, + "message": "服务不存在" + }) + continue + + # 获取容器ID + container_id = service.config.get("container_id") + if not container_id: + results.append({ + "service_id": service_id, + "success": False, + "message": "容器ID不存在" + }) + continue + + # 停止服务 + stop_result = service_orchestrator.stop_service(service_id, container_id) + if stop_result["success"]: + # 更新服务状态 + service.status = stop_result["status"] + db.commit() + success_count += 1 + results.append({ + "service_id": service_id, + "success": True, + "message": "服务停止成功" + }) + else: + results.append({ + "service_id": service_id, + "success": False, + "message": f"服务停止失败: {stop_result['error']}" + }) + + return BatchOperationResponse( + success=True, + message=f"批量停止完成,成功{success_count}个,失败{len(request.service_ids) - success_count}个", + results=results + ) + finally: + db.close() + + +@router.post("/batch/restart") +async def batch_restart_services( + request: BatchOperationRequest, + current_user: UserResponse = Depends(get_current_active_user) +): + """批量重启服务""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + results = [] + success_count = 0 + + for service_id in request.service_ids: + # 查询服务 + service = db.query(AlgorithmService).filter(AlgorithmService.service_id == service_id).first() + + if not service: + results.append({ + "service_id": service_id, + "success": False, + "message": "服务不存在" + }) + continue + + # 获取容器ID + container_id = service.config.get("container_id") + if not container_id: + results.append({ + "service_id": service_id, + "success": False, + "message": "容器ID不存在" + }) + continue + + # 重启服务 + restart_result = service_orchestrator.restart_service(service_id, container_id) + if restart_result["success"]: + # 更新服务状态 + service.status = restart_result["status"] + db.commit() + success_count += 1 + results.append({ + "service_id": service_id, + "success": True, + "message": "服务重启成功" + }) + else: + results.append({ + "service_id": service_id, + "success": False, + "message": f"服务重启失败: {restart_result['error']}" + }) + + return BatchOperationResponse( + success=True, + message=f"批量重启完成,成功{success_count}个,失败{len(request.service_ids) - success_count}个", + results=results + ) + finally: + db.close() + + +@router.post("/batch/delete") +async def batch_delete_services( + request: BatchOperationRequest, + current_user: UserResponse = Depends(get_current_active_user) +): + """批量删除服务""" + # 检查用户权限 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Insufficient permissions") + + # 创建数据库会话 + db = SessionLocal() + try: + results = [] + success_count = 0 + + for service_id in request.service_ids: + # 查询服务 + service = db.query(AlgorithmService).filter(AlgorithmService.service_id == service_id).first() + + if not service: + results.append({ + "service_id": service_id, + "success": False, + "message": "服务不存在" + }) + continue + + # 获取容器ID和镜像名称 + container_id = service.config.get("container_id") + image_name = f"algorithm-service-{service_id}:{service.version}" + + # 删除服务 + delete_result = service_orchestrator.delete_service(service_id, container_id, image_name) + + # 删除数据库记录 + db.delete(service) + db.commit() + success_count += 1 + results.append({ + "service_id": service_id, + "success": True, + "message": "服务删除成功" + }) + + return BatchOperationResponse( + success=True, + message=f"批量删除完成,成功{success_count}个,失败{len(request.service_ids) - success_count}个", + results=results + ) + finally: + db.close() diff --git a/backend/app/routes/user.py b/backend/app/routes/user.py index e9f5b64..7a40df5 100644 --- a/backend/app/routes/user.py +++ b/backend/app/routes/user.py @@ -2,9 +2,12 @@ from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from sqlalchemy.orm import Session from typing import List +from jose import JWTError, jwt +from app.config.settings import settings from app.models.database import get_db -from app.schemas.user import UserCreate, UserUpdate, UserResponse, UserListResponse, Token, LoginRequest +from app.models.models import User, Role +from app.schemas.user import UserCreate, UserUpdate, UserResponse, UserListResponse, Token, LoginRequest, RoleCreate, RoleResponse from app.services.user import UserService # 创建路由器 @@ -16,16 +19,72 @@ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/users/login") async def get_current_active_user(db: Session = Depends(get_db), token: str = Depends(oauth2_scheme)): """获取当前活跃用户""" - user = UserService.get_current_user(db, token) - if not user: + try: + # 检查令牌是否在黑名单中 + if UserService.is_token_blacklisted(token): + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + + # 解码令牌 + payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + + # 使用UserService获取用户信息,避免直接使用User模型 + user = UserService.get_user_by_username(db, username) + if not user: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + + # 检查用户是否活跃 + if user.status != "active": + raise HTTPException(status_code=400, detail="Inactive user") + + # 使用UserService获取角色信息 + role = UserService.get_role_by_id(db, user.role_id) + + # 构建角色响应 + role_response = None + if role: + role_response = RoleResponse( + id=role.id, + name=role.name, + description=role.description, + created_at=role.created_at, + updated_at=role.updated_at + ) + + # 构建用户响应 + user_response = UserResponse( + id=user.id, + username=user.username, + email=user.email, + role_id=user.role_id, + status=user.status, + created_at=user.created_at, + updated_at=user.updated_at, + role=role_response, + role_name=role.name if role else None + ) + + return user_response + except JWTError: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) - if user.status != "active": - raise HTTPException(status_code=400, detail="Inactive user") - return user from app.schemas.user import LoginRequest @@ -60,6 +119,10 @@ async def register(user: UserCreate, db: Session = Depends(get_db)): if UserService.get_user_by_email(db, user.email): raise HTTPException(status_code=400, detail="Email already registered") + # 检查角色是否存在 + if not UserService.get_role_by_id(db, user.role_id): + raise HTTPException(status_code=400, detail="Role not found") + # 创建用户 db_user = UserService.create_user(db, user) @@ -81,7 +144,7 @@ async def get_users( ): """获取用户列表""" # 只有管理员可以查看用户列表 - if current_user.role != "admin": + if current_user.role_name != "admin": raise HTTPException(status_code=403, detail="Not enough permissions") users = UserService.get_users(db, skip=skip, limit=limit) @@ -96,7 +159,7 @@ async def get_user( ): """获取用户信息""" # 只有管理员或用户本人可以查看用户信息 - if current_user.role != "admin" and current_user.id != user_id: + if current_user.role_name != "admin" and current_user.id != user_id: raise HTTPException(status_code=403, detail="Not enough permissions") user = UserService.get_user_by_id(db, user_id) @@ -115,15 +178,98 @@ async def update_user( ): """更新用户信息""" # 只有管理员或用户本人可以更新用户信息 - if current_user.role != "admin" and current_user.id != user_id: + if current_user.role_name != "admin" and current_user.id != user_id: raise HTTPException(status_code=403, detail="Not enough permissions") # 非管理员只能更新自己的信息,不能更新角色 - if current_user.role != "admin" and "role" in user_update.dict(): + if current_user.role_name != "admin" and "role_id" in user_update.dict(): raise HTTPException(status_code=403, detail="Cannot update role") + # 检查角色是否存在 + if "role_id" in user_update.dict(): + if not UserService.get_role_by_id(db, user_update.role_id): + raise HTTPException(status_code=400, detail="Role not found") + user = UserService.update_user(db, user_id, user_update) if not user: raise HTTPException(status_code=404, detail="User not found") return user + + +@router.delete("/{user_id}") +async def delete_user( + user_id: str, + current_user: UserResponse = Depends(get_current_active_user), + db: Session = Depends(get_db) +): + """删除用户""" + # 只有管理员可以删除用户 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Not enough permissions") + + # 检查用户是否存在 + user = UserService.get_user_by_id(db, user_id) + if not user: + raise HTTPException(status_code=404, detail="User not found") + + # 删除用户 + db.delete(user) + db.commit() + + return {"message": "User deleted successfully"} + + +# 角色管理API +@router.post("/roles", response_model=RoleResponse) +async def create_role( + role: RoleCreate, + current_user: UserResponse = Depends(get_current_active_user), + db: Session = Depends(get_db) +): + """创建角色""" + # 只有管理员可以创建角色 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Not enough permissions") + + # 检查角色名称是否已存在 + if UserService.get_role_by_name(db, role.name): + raise HTTPException(status_code=400, detail="Role name already exists") + + # 创建角色 + db_role = UserService.create_role(db, role) + + return db_role + + +@router.get("/roles", response_model=List[RoleResponse]) +async def get_roles( + current_user: UserResponse = Depends(get_current_active_user), + db: Session = Depends(get_db) +): + """获取角色列表""" + # 只有管理员可以查看所有角色 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Not enough permissions") + + roles = UserService.get_roles(db) + + return roles + + +@router.get("/roles/{role_id}", response_model=RoleResponse) +async def get_role( + role_id: str, + current_user: UserResponse = Depends(get_current_active_user), + db: Session = Depends(get_db) +): + """获取角色详情""" + # 只有管理员可以查看角色详情 + if current_user.role_name != "admin": + raise HTTPException(status_code=403, detail="Not enough permissions") + + role = UserService.get_role_by_id(db, role_id) + if not role: + raise HTTPException(status_code=404, detail="Role not found") + + return role diff --git a/backend/app/schemas/__pycache__/user.cpython-312.pyc b/backend/app/schemas/__pycache__/user.cpython-312.pyc index e7af03d4fe6830e8398b39c468eb1789f56c8df9..560b02879be6c88591853f42652476578031788d 100644 GIT binary patch literal 4088 zcmbVP-HRL76`zkgqtQsaEAO}CU3)*AIO8U(QnI$&x-Hmi$4+b&>==R|9mbleEvm1~ zNOkqlqNZ-qLXC$uskh{zHWacU#@UoYz)t8N5C|CQL3^R(q1lhT6;^)fQ_s0~R+?4h zwsc_5y>sq|?)jbHIp^xLfdO5B=ksDcdnzIb|Gw1c1>3e6p0+5~9#h2{=2?J#IZLUV_hb`-Q@A#H+b z$3Z(0((Ys0Nzm>OX@{%N7ze&WLk*cmPg$OGv1mIvs+`R_Ih$%{@>Vu?x$GJe)qYqi zXNv_ZN6Ce(S2jed*;d&pXY)=bK%F%t_}IA$ojZafq(xguOIN@ZY1x+2#8Dh|Ka4pM zTRsV`BsiK)Y~{ZCfyCFQqmBxrk2ANt4RUOKV(RXtwI4MnmTIs1BTcg8PVVlr$KeoZ z?Ab{`({(ty8{8vP9o=)BQW&CgEt3^UC(t#XR$l@bO8ei&L`oAB7~IEq6k&?CKePNNP5!r?sw zg1aj**&vgxXN}q`zP2*?I5F2G2Dcn1@3FiSgf$rHwfz4KLSk#75Y?R+glM!AqQuri zqw(GlMILuTbnETa&HBfCLX-u_!jmW*HyHJAxfrojLl$E=RS>JM-g>b0;3KL4zq7dt zg2{<=eu+k0@Rpgije)+vcOuXogH_xGEb8X*^Dqjm9`3U!dYCthIuuAo?<|OZ0W`XQ zWq$R$&C%nvbM;Jv9A6(luyT6!_2&4o+L`(ZjHr>xm66q>&5_00%k|4mvdF!M8~68K zKi)#RB(`MB_em!qLP7;!D2%tN5urMw{k4eWxN_DmJV7uwKK#wr-CqVUmn_e_QFQIp zQ;5s3GGJ8*zaE&5;3$e2cs(RJgK3=sbD}x=5(3jCFLASR;vTbQP~fxkQxN|PX@STZ zRFh~>O<3T9P7hTW1`6n6A)U&CUP{M9I#z2SU1=P=D=dszy4rmAubY2Z3xk((yOcq; zP}PG(Uh!N+=PB%CD_F31+1JCl7hpBpqL+Q&zyTEaW8MW2oP7u90MF~bx14W~xz@~K zWSM{NacsIl4!5Rffn%@xndLVcWVSUmQ#)Hf=U-mF*dQ~l?!qRSBtUo`5s7PPXO1697Jrtlg7sgG><0wk`wdARIQu z@+T!2^fbysACrU;?;HGG&{_WNrrsoM#d58SvDSmhA8^6{Zxz1sR(I&Ki7 zHGc%E=kxx_$NEfz9BCbzubr>|Y(-xFd6Ud@q;aeMNTY4Nv`3^FdMd9~P^VOmca=be zN+4!<9qZtR87jc7erNmM>P84Xs$eels8WWTNA78X4tHv9G|Q1x&KAnOxO@wzpg0b% zhu|VEbFJ8rA7}iVZp8*~zQPU0dHoGO3M2gt4wYpr(!3xmhDw#!ig3wcH?%Jw{dsHo zw?Pe#TbYdGd1e`hse0A1T*sw4`!vhdl9Mtb|AiOdfwT0QiPpI&z6Wo|%<?Nygv5XX${?6Lwtp~vcie)4k zLHA+>jP^Bl9?rop9Nln0%X-a5p1UYc!|P#n>X&c238qPAIRv<74+K~<@YzX$=!M`v z7qVbf4V5`aF1!B{7x?E-Mf$SFylkv}I0YXY6q? z)lTw1EZ=ue!7d`a-W?GCltoeeLP$Oql3xh3e;20PDiP0!^=ezdwmm3`QGc>6K-1P` z@u+{IEkM(bE8;Pn1Wh|3iHm&BVp~_md4GRffTlgHiidGNH0@zo9P(j4H0`)79;%1FWRZj*rpBf7Ts&<#z16?M=cO^0Fyk`4O<`V>eH@&$%IZ2rj0Fu=;oo_5Z?v`i^X z3Pb=8FMsFWOP=33_nc#Y6N`lf_@)0;$^9oN2>-%|onOEiY#$K?VOcN)L(B^WF(Vdy z8DGJl@r#K0@=_s?2^8dv%%1)EU?G?Zih@r#DHzgwf)OC%=YGCdMq#K7Xpkr!G{jH^ z(2#3xn4w`nBd)m-hDHI6x#mV08V9t`g~k|~0Q3nL8fR!fpaU+nkD-Hr4!O_-Lx%x< zk|a9c`vgNr03CIq{S4g$=$LDVf!eq_aSzQ`{WNq;x5(L&LGm=PkRy46DklnhE`P3K zsy?dxq+H3Bih7<(XL43W6{%wA6;jC+NY?QMyGhQ&_96_H1tMfbL&*5fgM%`D!dP5(_d~l%`^t5ZMhs$Q%^b6t zDplB{s2508hH3ZSxw(1sOBx_Z4wX<>jdqrAefIv=(qDkEph4c$tNDr<2OX8nQl6+W zs%RQ+q-iv)X@!ze&Eq(#X>V8cyrT(fno-JXni+wWCccvTt%^zeG)*rSOBEd*VSygG zHv3Q{P~e#`2S8jGwm}O2JCQ=;t&~x{SS{5`)zsND3;ELJl%Bs>GINznh5gp0(&a3W zle(a1-y%gLrI*VoD|-oSvr=f;T)AfADP#ga#aaOID`8CTFpc&eUlNQc&j$5viieWN*iaPdU_a6>w{mKa)j^VVE5adh!`eWocLHOF=~ z_Ku+MgSt0@AX+5DXZUYO9gjmiK|BPQ$7MB0!)WwNCV}W=K3}hYyng34_dNIc+_(IF2TF1UlTp zrHm#{%;DzX0VJj=9pFoFc9+>s781692AW>8y$%jw3LK`8bC@I~0I;y@fH6`4i?}e^ znHP0o?5M$UQ8;<$%XqXIc^e;pweis{H+gAS#9^>e*@B3yTIMu7s4-9WSd1d)F7~=Z z)|^2tZqZ9?5-}9`GV2To9(|KZ;PaAgEfpG4vNin_Mwxx;Ze*e%J=NMX2{HDp{llgG z4QaA9KE1e5KV_d=I@^$@Te}OJQj$9ZxA%6&^PuT<27w%A_>e}3ya3N)hLnM#;bgXe z6OEE8(N9 zIz3AoG`*gFbj5MBva23J7TD=tYKj`7(KDrsx#DZ&?JBV(84UiSbDHrv-p_Se7I zHkSW-Z}}_U8->Zw%Q=%+SeG8v9sLM4Hd!sgO3+IYmP-@GF}OP2(bU@5^wj}q3dfFO z3FQpD>sKZWIY4X2CY9_OE z2IiPggGlq*`z${99KIhThTr)W_^^2nTt&qAaq`npQ{!^G}%K`D2Sg*AOytflR zao!$j3vg?PWpTzHZ3}Q~_eatsVD^eKstBTRZ9(r|PG1JcZ+=9l~)E$Mg1c rIG%4uCGimM1GjeE2XC>T#}~lc;0?2O2H!B-?uYGGM(^XUERp;lQs?yT diff --git a/backend/app/schemas/user.py b/backend/app/schemas/user.py index a28b072..06a7cd4 100644 --- a/backend/app/schemas/user.py +++ b/backend/app/schemas/user.py @@ -3,12 +3,30 @@ from typing import Optional, List from datetime import datetime +class RoleBase(BaseModel): + """角色基础模式""" + id: Optional[str] = None + name: str = Field(..., description="角色名称") + description: str = Field(default="", description="角色描述") + + +class RoleCreate(RoleBase): + """创建角色模式""" + pass + + +class RoleResponse(RoleBase): + """角色响应模式""" + created_at: datetime + updated_at: Optional[datetime] = None + + class UserBase(BaseModel): """用户基础模式""" id: Optional[str] = None username: str = Field(..., description="用户名") email: EmailStr = Field(..., description="邮箱") - role: str = Field(default="user", description="用户角色") + role_id: str = Field(..., description="角色ID") class UserCreate(UserBase): @@ -20,7 +38,7 @@ class UserUpdate(BaseModel): """更新用户模式""" username: Optional[str] = None email: Optional[EmailStr] = None - role: Optional[str] = None + role_id: Optional[str] = None status: Optional[str] = None password: Optional[str] = None @@ -30,6 +48,8 @@ class UserResponse(UserBase): status: str created_at: datetime updated_at: Optional[datetime] = None + role: Optional[RoleResponse] = None + role_name: Optional[str] = None class UserListResponse(BaseModel): @@ -56,28 +76,4 @@ class LoginRequest(BaseModel): password: str = Field(..., description="密码") -class APIKeyBase(BaseModel): - """API密钥基础模式""" - id: Optional[str] = None - user_id: str = Field(..., description="用户ID") - name: str = Field(..., description="密钥名称") - -class APIKeyCreate(APIKeyBase): - """创建API密钥模式""" - expires_at: datetime = Field(..., description="过期时间") - - -class APIKeyResponse(APIKeyBase): - """API密钥响应模式""" - key: str - expires_at: datetime - status: str - created_at: datetime - updated_at: Optional[datetime] = None - - -class APIKeyListResponse(BaseModel): - """API密钥列表响应模式""" - api_keys: List[APIKeyResponse] - total: int diff --git a/backend/app/services/__pycache__/user.cpython-312.pyc b/backend/app/services/__pycache__/user.cpython-312.pyc index 369a7515985975026e22fa7791ca31cceb59bbd6..2b77affdab17e9797e71e38492f8b0ce4085236c 100644 GIT binary patch delta 3860 zcmb_fdu&tJ8NbJGJGO7)M`GvwCZ;8j5pAR8Q6MZOlmHEn)+G;*@9n6m91ammu7WKvaK|c|6f^3yCI*4Sy zfoWC>fZn;})~DgE0?*&vCs zC>6;Cl0hyEo225ShG9(~Ay_oKS|S@^)g~AEVFh?f7x5I&@|67tPx&IA65y%g=j6y< z$p`-iIh*gcTnJmFilfH)BTHwuGf0-OL8@G|Nm;KY5MUqce`(4EEok28fT5iD3t_Gr z_J@@H0Yb~*MIiviw3z+I*h)%AD@=bN#Lm*@ZKf&|3$RU=YEsPNmTR!O%=&YZd>ZK( zgD-9SqM`OzqY)+kj7n-?!>d?s25{LpB7jsBcBwH9?57TrE8Eyr^%S)L!gKP zTA;+dSzp-EtR}}0+5If;q*oIARC5AC-Wri0`WBpag<>+@iklJIh=ZMC=;&qyG={E2 zc-#{D9MZDbX0a%T3z=vGQt)_MhtSB9VhQMaUepl-vaq$LY;v2W$~U;tI{w6G(-~HK zNnMt0NcVb8g2x=uSwxl34<)6IHJ7FM5CvD2a&4aN2n49e{nTY9|g}YhUmjUw*mAOGtup9o%6|VASq}{zmPTw znXVIujvYE{IDTY8tVoF!?{)snbJc&vKVJFlxVU;k+?WzK{<`jWTW@Y1+tr+^YaSO{ zCPXPEO5(yHE+WyFU@~VpsxWUk z`_fh0v=Jy@#l-rX^`9I})$JY^_e_Y*DG^L<9kaA@3ss{W3q_*L>3W~JJVnbEbVFt6 zUWCQkAYnn97Ec!`Ww$&9Y>UZC#=df@*bkGr%;|Kn_1=Q{gz5F>*FV`)s;N61#;R)r zbyR&Q8vQ`8)_5eu+VOyTA+*7KfC!{C`yQ$QQJxeuXR%78hR6`;WkyImMt*YNI zAJP&4(^_*fuiz#4ihYho0KhOwQcdmMu~;Myo5^7+Lnkz7mhJ!!KTlBAEbZe(pcsG# zHlxwoeMytYclw1>FR)L2%b}?l{U=BP-+MoB1*}@ncm>ZfNRjq9UBa&9`t!ShK)aE{ zteu1TM=3%No63C(x~nVi&k*&`@-EkMrLhue2?F1ERy}SRKMoaLtl7u;y;fdanDba% zx_=0)G5cudCBrZV4W8HZhXqK8kk!pva^YfTnNAPyBRx4r){tAy&g9sW4=()h!LgtA z8PUnh8fgc}1@sgnq8hM8su_~3w9^RhGhlBgtk72xq6kieeuVEL#1IyYpS6OQC65LA z7*CqF#KrrNn$b?>P+aC~tj*`OA=6J_Go_OyeJgxf-qZe5{yV<>313ypSM|tjaN7pV zX(#)uuhPWb5Md>i7ul%G71k^Y7_|<;735XOvutq{qDJ#o2y@j5*A!Qwbzd(eTwgAJ zB{a$O+mUv;`th}^>{eDWYjFESJYBW&97TWe9`O6hjO585OkWsz@YdDI6Yo4pqka&5 ztS`I)gvT_>Tzo2S-GS?Km6V$(Qp1+JeJnG(fCs6a zuuPYSJY?sVR@fyn_W}1BVKx5ZrIK!*pgT;IvbYg;;EzNkJ*2fxdjs|p{vx*BpHWPN z!#bsW5u;8rE@IRnV-k4gM2XOAf{#UW!V6nX4!k>g;rQg6@622ud~o?a%@wLKB*h|K z6w5794lq4>efs*j>C5M*PrfmEYVdC#y*YLK{i(CZrjGR^zWe&jnUiqI^aCp|fdtm@ z)S1gO{Xd$1`{LBV)#SX$OD4QEDR0e4=}5=8 zckO`fuBT|ivm)hLG2$B8J?>dOVEr6E0dnv9%kFsd@8oZIWYp(62O2=s;hV6RrR-%x z8!p;z+gBo+|E{m}jyLa4{yJduI|nvvY)j_&te@Jymd*e^o_+z+2yVlW&R}u{%Gr*B z`Xq0FyniQvNHGJb0pXhnc>QSKXEvPi%l}23@#cw5n6@CSM=&AC2qMA(giM6P2uBdO z+j)aP-_!32)qp%8-^ce803QfkTkUI!2Mi$#{*_gFR$BP4UNeen-2N~I@jn|&P zvGc>mhn)6>UNE`RI$Ta$W~Xgr@Ege4MlLpKY8S9vICi# z$q;95CL^=sjoMEPH=jYF<^`cNG-!-(_{-)0Yj zS-O&KDOy#vi45++qc)Kdw>Dn$-6;RC5RcfjaKt8dsc3bn$GCFvU|N9TV(mj5_;#P` zV5WJ@&;GQmc@6(8!#hKDhkAOd+q=8Mk&f!QUt;|0TFt_h82oIADzk$YS|8`-y=&-Z8i)6}3RD<2Ao H{FHwK)r{-_ delta 4203 zcmai1eQZ6=>6v=pLhQ-Dg7_D8pK?z0`I zE$x&1yZ4=Y?mh4P?z!h45C8baPU~MR783{0!LnHJrt73NkN@yw#fEyG3vdA;l&=Cy_GUORiw2xWz{z1d-h*AdR~=7e*-xlC>fIm3D0ypuPbi}N*H z9T%`342le06mY6tU!UG%ij~~^alu9Q>;V^`-2_8gpWEbA|LekDC47B6qa1$eR% zn@o}i4XH;kBGe+xb&5QPG8_F|bUE21fi$25O_DVT8)=EHgm(?Ev1xdIBaN0^rz^AE ztMrQgC*2b1A(^102(7_TL?X&A?A1idAVVELV=?w!8=S?n#3o@_xGnkFv* zD4Jk^ya=7w6GoASlu;UT)X?9Q*6<~C+HrgF+^NKii{RYk2cuwi?mu%n?2K-m+#c*w z^r2ul7@>6wZcwk&vLfw66rr=V6?cCp%vZGjP{^ZI8Q6gqP%2~Gu-&GAa8}aIWlsyt zx8`9_UX0(i4fT*N_DzbV%P-46?IZyoM!BLRogv9%QFPti!GNMitWmUW(ms`j)I4?5 z%W)Yz7NnJ$3kplwRy5-~Qll6GyL?E#JR5+tp&%;QbI#_U%%`^to`6I0Wx)WynXMtg z98ZS2@{e%7E)Z;q5HzA_yE=iEU_=VbiUIuhM!NPxvhO4WdwK-)nJh-nKIYCBRt`oh~y51H(dmJ_mOG&nqCq`zMD z3_Vb}j9RLe(a$RnS3J-d^bXYmF53dX)Pv_6pGW`TAb;jZg@8^nv$RqbA9K`4n^vX*%YFj`1rx8EHD12^|yDv82{9&+0_I*2fsjoK^CQk1=LR z)3NnfJ)&Y!Z-^}t*&A$;x-r#)Wa^DW)2Dv>*`;GsuMFOM^IaAxiq+p0^i{M=J-!wq z`5`II1LYQsi{yjp8BgM)W}a?!HEIGn`jTsebV97^I2`i9((romi6nz5Ye{o`*<4V+2sPV%;4^x|!!?oIlYaSYwW5KFRThf*O)k#84L-0Mma z#dw;lum&`4;v!1`fGdHsWew~*vhR{GF1jYf^0-)jb?>#F!JeV@@rrN0Adj=F`PKR6 zX#acP>A|aDX3nK|9F3=Y;F$Y?J{B0grQha+s`DqTD8Ai~-of6X9r21EjEid~#D=)o zFfMKwGj5o@=&wiT!y@W_s8{~ic4aDd_Wt1YukQ_ue?Pjn{i`lH(_E5qSMUbJtttDO zSI;LmFJ15b?{w_t!Iwvz@rqUB;_A5-4D5}I{!j0wwdE$~eodc7=6m=6w7yhg>Z2#; zKmDvt0@R35U?(Qviwp#b~5k zPCN67DgAR97y9w@V7*QdnJ#c(sLRNk@E;FGa?JD zhEJAhcmxzfGVRSF$p+CM48UcQq$%24JU3>(s_-c+CSxozqO#o+SvB!2B&ujUt1f2v zSj<(4%FG_9JyLsa`-kSTq+r5a6gL-LHC_`3#c}u256w$qJudj}9$9fJi2Vd?4w_I{4QDj$px!gyfC%o%*Wfbc7Xg9unksdYMwDTJ%=lihHS z9ppaN72eg`XEafVzTn*Q84jAEM%IjOeTZ*~3I=*JRjFF$-0nol^JJprSuy&<`1dw^ zL(P+z(wL}{8u^iIoYKgT=DlAYU%d&ZH1dzM(Uc-wE6I}SN?pQCOTtWG^y#-lkF#P` zJ%DCNJHtUUVjRtluc&{B{e&CPn{l)CMZNRfwiynZp)Jt3^v;p(qpk7pZ+wU{rv5+! zJ(a&h)L*q@9^TJNw!f>Zx}~$DHMqMv`6rl|>8DlBs!XIBw@I;~lHAe;e-7np%t~sB z$*M~mYT0SY;+!2=_7MEzt5)J{gXV6UVth8-8R!m4wFIwT*fXd+0cNy3&)?w|-r-8_ waK)c+3qRpX|IV4GP*Qn^YaHhq>G8$6h0Pk?@qk18PpfV{&pRJ-h|H`11HXz(6951J diff --git a/backend/app/services/permission.py b/backend/app/services/permission.py index e43cadb..80b12e2 100644 --- a/backend/app/services/permission.py +++ b/backend/app/services/permission.py @@ -8,7 +8,7 @@ import logging from sqlalchemy.orm import Session from sqlalchemy import and_, or_ -from app.models.models import User, Algorithm, APIKey +from app.models.models import User, Algorithm logger = logging.getLogger(__name__) @@ -209,26 +209,7 @@ class PermissionManager: logger.error(f"Error getting algorithm permissions: {str(e)}") return [] - def check_api_key_access(self, db: Session, api_key_value: str, algorithm_id: str) -> bool: - """检查API密钥对算法的访问权限""" - try: - # 通过API密钥查找用户 - api_key = db.query(APIKey).filter( - APIKey.key == api_key_value, - APIKey.status == "active" - ).first() - - if not api_key: - return False - - # 检查用户对算法的访问权限 - return self.check_algorithm_access( - db, api_key.user_id, algorithm_id, PermissionType.EXECUTE - ) - - except Exception as e: - logger.error(f"Error checking API key access: {str(e)}") - return False + def validate_user_algorithm_operation(self, db: Session, user_id: str, algorithm_id: str, operation: str) -> bool: diff --git a/backend/app/services/user.py b/backend/app/services/user.py index 7e8b20c..953a4e8 100644 --- a/backend/app/services/user.py +++ b/backend/app/services/user.py @@ -2,12 +2,12 @@ from datetime import datetime, timedelta from typing import Optional, List from jose import JWTError, jwt from passlib.context import CryptContext -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, joinedload import uuid from app.config.settings import settings -from app.models.models import User, APIKey -from app.schemas.user import UserCreate, UserUpdate, TokenData, APIKeyCreate +from app.models.models import User, Role +from app.schemas.user import UserCreate, UserUpdate, TokenData, RoleCreate from app.utils.cache import cache # 密码加密上下文,使用pbkdf2_sha256方案,避免bcrypt的密码长度限制 @@ -86,12 +86,12 @@ class UserService: @staticmethod def get_user_by_username(db: Session, username: str) -> Optional[User]: """通过用户名获取用户""" - return db.query(User).filter(User.username == username).first() + return db.query(User).options(joinedload(User.role)).filter(User.username == username).first() @staticmethod def get_user_by_id(db: Session, user_id: str) -> Optional[User]: """通过ID获取用户""" - return db.query(User).filter(User.id == user_id).first() + return db.query(User).options(joinedload(User.role)).filter(User.id == user_id).first() @staticmethod def get_user_by_email(db: Session, email: str) -> Optional[User]: @@ -101,7 +101,7 @@ class UserService: @staticmethod def get_users(db: Session, skip: int = 0, limit: int = 100) -> List[User]: """获取用户列表""" - return db.query(User).offset(skip).limit(limit).all() + return db.query(User).options(joinedload(User.role)).offset(skip).limit(limit).all() @staticmethod def create_user(db: Session, user: UserCreate) -> User: @@ -115,7 +115,7 @@ class UserService: username=user.username, email=user.email, password_hash=UserService.get_password_hash(user.password), - role=user.role + role_id=user.role_id ) # 保存到数据库 @@ -159,80 +159,64 @@ class UserService: if not UserService.verify_password(password, user.password_hash): return None return user - - -class APIKeyService: - """API密钥服务类""" @staticmethod - def create_api_key(db: Session, api_key_create: APIKeyCreate) -> APIKey: - """创建API密钥""" - # 生成唯一ID和密钥 - api_key_id = f"key-{uuid.uuid4().hex[:8]}" - api_key_value = f"sk_{uuid.uuid4().hex}" + def create_role(db: Session, role: RoleCreate) -> Role: + """创建角色""" + # 生成唯一ID + role_id = f"role-{uuid.uuid4().hex[:8]}" - # 创建API密钥实例 - db_api_key = APIKey( - id=api_key_id, - user_id=api_key_create.user_id, - name=api_key_create.name, - key=api_key_value, - expires_at=api_key_create.expires_at + # 创建角色实例 + db_role = Role( + id=role_id, + name=role.name, + description=role.description ) # 保存到数据库 - db.add(db_api_key) + db.add(db_role) db.commit() - db.refresh(db_api_key) + db.refresh(db_role) - return db_api_key + return db_role @staticmethod - def get_api_key_by_id(db: Session, api_key_id: str) -> Optional[APIKey]: - """通过ID获取API密钥""" - return db.query(APIKey).filter(APIKey.id == api_key_id).first() + def get_role_by_id(db: Session, role_id: str) -> Optional[Role]: + """通过ID获取角色""" + return db.query(Role).filter(Role.id == role_id).first() @staticmethod - def get_api_key_by_value(db: Session, api_key_value: str) -> Optional[APIKey]: - """通过值获取API密钥""" - return db.query(APIKey).filter(APIKey.key == api_key_value).first() + def get_role_by_name(db: Session, role_name: str) -> Optional[Role]: + """通过名称获取角色""" + return db.query(Role).filter(Role.name == role_name).first() @staticmethod - def get_api_keys_by_user_id(db: Session, user_id: str) -> List[APIKey]: - """通过用户ID获取API密钥列表""" - return db.query(APIKey).filter(APIKey.user_id == user_id).all() + def get_roles(db: Session, skip: int = 0, limit: int = 100) -> List[Role]: + """获取角色列表""" + return db.query(Role).offset(skip).limit(limit).all() @staticmethod - def revoke_api_key(db: Session, api_key_id: str) -> Optional[APIKey]: - """撤销API密钥""" - # 获取API密钥 - db_api_key = APIKeyService.get_api_key_by_id(db, api_key_id) - if not db_api_key: - return None + def init_default_roles(db: Session) -> None: + """初始化默认角色""" + # 检查是否已存在默认角色 + admin_role = UserService.get_role_by_name(db, "admin") + user_role = UserService.get_role_by_name(db, "user") - # 更新状态为已撤销 - db_api_key.status = "revoked" + # 创建管理员角色 + if not admin_role: + admin_role = RoleCreate( + name="admin", + description="系统管理员,拥有所有权限" + ) + UserService.create_role(db, admin_role) - # 保存到数据库 - db.commit() - db.refresh(db_api_key) - - return db_api_key - - @staticmethod - def validate_api_key(db: Session, api_key_value: str) -> Optional[APIKey]: - """验证API密钥""" - # 获取API密钥 - api_key = APIKeyService.get_api_key_by_value(db, api_key_value) - if not api_key: - return None - - # 检查状态 - if api_key.status != "active": - return None - - # 检查是否过期 - if api_key.expires_at < datetime.utcnow(): - return None - - return api_key + # 创建普通用户角色 + if not user_role: + user_role = RoleCreate( + name="user", + description="普通用户,拥有基本权限" + ) + UserService.create_role(db, user_role) + + + diff --git a/backend/check_admin.py b/backend/check_admin.py new file mode 100644 index 0000000..e9ca686 --- /dev/null +++ b/backend/check_admin.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +""" +检查并重置管理员账号 +""" + +from sqlalchemy.orm import Session +from app.models.database import engine, Base, SessionLocal +from app.models.models import User, Role +from app.services.user import UserService + + +def check_admin(): + """检查并重置管理员账号""" + db = SessionLocal() + + try: + # 检查是否存在管理员账号 + print("检查管理员账号...") + admin_user = db.query(User).filter(User.username == "admin").first() + + if not admin_user: + print("⚠️ 管理员账号不存在,创建新的管理员账号...") + + # 初始化默认角色 + UserService.init_default_roles(db) + + # 获取默认管理员角色 + admin_role = UserService.get_role_by_name(db, "admin") + if not admin_role: + print("❌ 管理员角色不存在,创建失败") + return + + # 创建默认管理员账号 + admin_user = User( + id="user-admin", + username="admin", + email="admin@example.com", + password_hash=UserService.get_password_hash("admin123"), + role_id=admin_role.id, + status="active" + ) + db.add(admin_user) + db.commit() + db.refresh(admin_user) + print("✅ 管理员账号创建成功") + else: + print("✅ 管理员账号存在,重置密码...") + # 重置管理员密码 + admin_user.password_hash = UserService.get_password_hash("admin123") + db.commit() + print("✅ 管理员密码重置成功") + + # 显示管理员账号信息 + print("\n管理员账号信息:") + print(f"用户名: {admin_user.username}") + print(f"密码: admin123") + print(f"邮箱: {admin_user.email}") + print(f"状态: {admin_user.status}") + + # 检查角色信息 + if admin_user.role: + print(f"角色: {admin_user.role.name}") + else: + print("⚠️ 管理员角色信息缺失") + # 尝试修复角色关联 + admin_role = UserService.get_role_by_name(db, "admin") + if admin_role: + admin_user.role_id = admin_role.id + db.commit() + print("✅ 管理员角色关联修复成功") + + except Exception as e: + print(f"❌ 操作失败: {e}") + finally: + db.close() + + +if __name__ == "__main__": + check_admin() diff --git a/backend/init_db.py b/backend/init_db.py index 4f7fafe..24ac6da 100644 --- a/backend/init_db.py +++ b/backend/init_db.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -初始化数据库,创建默认管理员账号 +初始化数据库,创建默认管理员账号和角色 """ from sqlalchemy.orm import Session @@ -16,11 +16,25 @@ def init_db(): Base.metadata.create_all(bind=engine) print("数据库表创建完成") - # 创建默认管理员账号 - print("\n创建默认管理员账号...") + # 初始化默认角色 + print("\n初始化默认角色...") db = SessionLocal() try: + # 初始化默认角色 + UserService.init_default_roles(db) + print("✅ 默认角色初始化完成") + + # 获取默认角色 + admin_role = UserService.get_role_by_name(db, "admin") + user_role = UserService.get_role_by_name(db, "user") + + if not admin_role or not user_role: + print("❌ 默认角色创建失败") + return + + # 创建默认管理员账号 + print("\n创建默认管理员账号...") # 检查是否已存在管理员账号 admin_user = db.query(User).filter(User.username == "admin").first() @@ -31,7 +45,7 @@ def init_db(): username="admin", email="admin@example.com", password_hash=UserService.get_password_hash("admin123"), - role="admin", + role_id=admin_role.id, status="active" ) db.add(admin_user) diff --git a/backend/start_server.sh b/backend/start_server.sh index fcceaee..94d7a69 100755 --- a/backend/start_server.sh +++ b/backend/start_server.sh @@ -1,4 +1,4 @@ #!/bin/bash cd /Users/duguoyou/MLFlow/algorithm-showcase/backend source venv/bin/activate -PYTHONPATH=. uvicorn app.main:app --host 0.0.0.0 --port 8002 +PYTHONPATH=. uvicorn app.main:app --host 0.0.0.0 --port 8001 diff --git a/backend/update_db.py b/backend/update_db.py new file mode 100644 index 0000000..7ac3886 --- /dev/null +++ b/backend/update_db.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +""" +更新数据库结构,删除api_keys表,添加roles表,修改users表 +""" + +from sqlalchemy.orm import Session +from sqlalchemy import text +from app.models.database import engine, Base, SessionLocal +from app.models.models import User, Role +from app.services.user import UserService + + +def update_db(): + """更新数据库结构""" + db = SessionLocal() + + try: + # 1. 删除api_keys表 + print("删除api_keys表...") + try: + db.execute(text("DROP TABLE IF EXISTS api_keys CASCADE")) + db.commit() + print("✅ api_keys表删除成功") + except Exception as e: + print(f"⚠️ 删除api_keys表时出错: {e}") + db.rollback() + + # 2. 创建roles表 + print("\n创建roles表...") + try: + # 直接执行SQL创建表,避免依赖模型的顺序 + db.execute(text(""" + CREATE TABLE IF NOT EXISTS roles ( + id VARCHAR PRIMARY KEY, + name VARCHAR UNIQUE NOT NULL, + description TEXT DEFAULT '', + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() + ) + """)) + db.commit() + print("✅ roles表创建成功") + except Exception as e: + print(f"⚠️ 创建roles表时出错: {e}") + db.rollback() + + # 3. 修改users表,添加role_id字段,删除role字段 + print("\n修改users表...") + try: + # 检查是否存在role_id字段 + result = db.execute(text("SELECT column_name FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'role_id'")).fetchone() + + if not result: + # 添加role_id字段 + db.execute(text("ALTER TABLE users ADD COLUMN role_id VARCHAR")) + print("✅ 添加role_id字段成功") + + # 初始化默认角色 + UserService.init_default_roles(db) + print("✅ 默认角色初始化成功") + + # 获取默认角色 + admin_role = UserService.get_role_by_name(db, "admin") + user_role = UserService.get_role_by_name(db, "user") + + if admin_role and user_role: + # 更新现有用户的role_id字段 + db.execute(text(f"UPDATE users SET role_id = CASE WHEN role = 'admin' THEN '{admin_role.id}' ELSE '{user_role.id}' END")) + print("✅ 更新用户role_id字段成功") + + # 删除role字段 + result = db.execute(text("SELECT column_name FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'role'")).fetchone() + if result: + db.execute(text("ALTER TABLE users DROP COLUMN role")) + print("✅ 删除role字段成功") + + # 添加外键约束 + db.execute(text("ALTER TABLE users ADD CONSTRAINT fk_users_role FOREIGN KEY (role_id) REFERENCES roles(id)")) + print("✅ 添加外键约束成功") + + db.commit() + except Exception as e: + print(f"⚠️ 修改users表时出错: {e}") + db.rollback() + + # 4. 检查并创建默认管理员账号 + print("\n检查默认管理员账号...") + try: + # 检查是否已存在管理员账号 + admin_user = db.query(User).filter(User.username == "admin").first() + + if not admin_user: + # 获取默认管理员角色 + admin_role = UserService.get_role_by_name(db, "admin") + if admin_role: + # 创建默认管理员账号 + admin_user = User( + id="user-admin", + username="admin", + email="admin@example.com", + password_hash=UserService.get_password_hash("admin123"), + role_id=admin_role.id, + status="active" + ) + db.add(admin_user) + db.commit() + db.refresh(admin_user) + print("✅ 默认管理员账号创建成功") + print(f"用户名: admin") + print(f"密码: admin123") + else: + print("❌ 无法创建管理员账号,因为admin角色不存在") + else: + print("⚠️ 管理员账号已存在") + + except Exception as e: + print(f"⚠️ 检查管理员账号时出错: {e}") + db.rollback() + + print("\n✅ 数据库结构更新完成") + + finally: + db.close() + + +if __name__ == "__main__": + update_db() diff --git a/backend/uvicorn.log b/backend/uvicorn.log index 2f27c8b..419da8e 100644 --- a/backend/uvicorn.log +++ b/backend/uvicorn.log @@ -4255,3 +4255,12 @@ INFO: 127.0.0.1:58386 - "GET /api/v1/repositories HTTP/1.1" 200 OK INFO: 127.0.0.1:58388 - "GET /api/v1/gitea/config HTTP/1.1" 200 OK INFO: 127.0.0.1:58409 - "GET /api/v1/repositories HTTP/1.1" 200 OK INFO: 127.0.0.1:58411 - "GET /api/v1/gitea/config HTTP/1.1" 200 OK +INFO: 127.0.0.1:58972 - "GET /api/v1/repositories HTTP/1.1" 200 OK +INFO: 127.0.0.1:58976 - "GET /api/v1/gitea/config HTTP/1.1" 200 OK +INFO: 127.0.0.1:59054 - "GET /api/v1/repositories HTTP/1.1" 200 OK +INFO: 127.0.0.1:59058 - "GET /api/v1/gitea/config HTTP/1.1" 200 OK +INFO: 127.0.0.1:59080 - "GET /api/v1/repositories HTTP/1.1" 200 OK +INFO: 127.0.0.1:59084 - "GET /api/v1/gitea/config HTTP/1.1" 200 OK +INFO: 127.0.0.1:59104 - "GET /api/v1/repositories HTTP/1.1" 200 OK +INFO: 127.0.0.1:59108 - "GET /api/v1/gitea/config HTTP/1.1" 200 OK +INFO: 127.0.0.1:59318 - "GET /api/v1/repositories HTTP/1.1" 401 Unauthorized diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 6404d7f..e54fc43 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -77,14 +77,7 @@ const routes: Array = [ title: '用户管理' } }, - { - path: 'api-keys', - name: 'AdminApiKeys', - component: () => import('../views/admin/AdminApiKeysView.vue'), - meta: { - title: 'API密钥管理' - } - }, + { path: 'api', name: 'AdminApiManagement', @@ -157,7 +150,9 @@ router.beforeEach((to, _from, next) => { if (to.meta.requiresAdmin) { try { const userObj = JSON.parse(user) - if (userObj.role !== 'admin') { + // 检查用户是否为管理员,支持多种格式 + const isAdmin = userObj.role?.name === 'admin' || userObj.role_name === 'admin' + if (!isAdmin) { next({ name: 'Home' }) return } diff --git a/frontend/src/stores/user.ts b/frontend/src/stores/user.ts index e8878da..d68c98e 100644 --- a/frontend/src/stores/user.ts +++ b/frontend/src/stores/user.ts @@ -1,12 +1,20 @@ import { defineStore } from 'pinia' import axios from 'axios' +// 定义角色类型 +interface Role { + id: string + name: string + description: string +} + // 定义用户类型 interface User { id: string username: string email: string - role: string + role_id: string + role?: Role status: string } @@ -21,7 +29,7 @@ interface RegisterRequest { username: string password: string email: string - role: string + role_id: string } // 定义用户存储 @@ -35,7 +43,7 @@ export const useUserStore = defineStore('user', { getters: { isLoggedIn: (state) => !!state.token, - isAdmin: (state) => state.user?.role === 'admin' + isAdmin: (state) => state.user?.role?.name === 'admin' }, actions: { diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue index c2923fb..dafc510 100644 --- a/frontend/src/views/AdminView.vue +++ b/frontend/src/views/AdminView.vue @@ -38,12 +38,7 @@ 用户管理 - - - API密钥管理 - + @@ -62,7 +57,7 @@ diff --git a/frontend/src/views/admin/AdminServiceRegistrationView.vue b/frontend/src/views/admin/AdminServiceRegistrationView.vue index 1326263..d211fc1 100644 --- a/frontend/src/views/admin/AdminServiceRegistrationView.vue +++ b/frontend/src/views/admin/AdminServiceRegistrationView.vue @@ -50,32 +50,31 @@
{{ repo.name }}
{{ repo.description || '无描述' }}
+
{{ repo.repo_url || '无仓库地址' }}
- - - + + - -
-
{{ algorithm.name }}
-
{{ algorithm.description || '无描述' }}
-
-
-
+ :disabled="true" + /> +
+ + + @@ -271,6 +270,7 @@ import { ref, reactive, onMounted } from 'vue' import { Check, Refresh } from '@element-plus/icons-vue' import { ElMessage, ElMessageBox } from 'element-plus' import { useRouter } from 'vue-router' +import axios from 'axios' // 路由 const router = useRouter() @@ -281,14 +281,14 @@ const serviceFormRef = ref() // 加载状态 const submitLoading = ref(false) -// 仓库和算法列表 +// 仓库列表 const repositories = ref([]) -const algorithms = ref([]) // 服务表单 const serviceForm = reactive({ repository_id: '', - algorithm_id: '', + repository_description: '', + repository_url: '', name: '', version: '1.0.0', description: '', @@ -308,9 +308,6 @@ const rules = { repository_id: [ { required: true, message: '请选择算法仓库', trigger: 'blur' } ], - algorithm_id: [ - { required: true, message: '请选择算法', trigger: 'blur' } - ], name: [ { required: true, message: '请输入服务名称', trigger: 'blur' }, { min: 2, max: 50, message: '服务名称长度应在 2-50 个字符之间', trigger: 'blur' } @@ -343,93 +340,60 @@ const registrationResult = reactive({ // 加载仓库列表 const loadRepositories = async () => { try { - // 这里应该调用后端API获取仓库列表 - // 暂时使用模拟数据 + // 调用后端API获取仓库列表 + const response = await axios.get('/api/repositories') + if (response.data.success) { + repositories.value = response.data.repositories + console.log('仓库列表加载完成:', repositories.value) + } else { + throw new Error('Failed to load repositories') + } + } catch (error) { + console.error('加载仓库列表失败:', error) + ElMessage.error('加载仓库列表失败') + // 使用备用模拟数据 repositories.value = [ { id: 'repo-001', name: '图像分类算法', description: '基于ResNet的图像分类算法仓库', type: 'python', - status: 'active' + status: 'active', + repo_url: 'https://github.com/example/image-classification' }, { id: 'repo-002', name: '文本分类算法', description: '基于BERT的文本分类算法仓库', type: 'python', - status: 'active' - }, - { - id: 'repo-003', - name: '目标检测算法', - description: '基于YOLOv5的目标检测算法仓库', - type: 'python', - status: 'active' - }, - { - id: 'repo-004', - name: '推荐系统算法', - description: '基于协同过滤的推荐系统算法仓库', - type: 'nodejs', - status: 'active' + status: 'active', + repo_url: 'https://github.com/example/text-classification' } ] - console.log('仓库列表加载完成') - } catch (error) { - console.error('加载仓库列表失败:', error) - ElMessage.error('加载仓库列表失败') - } -} - -// 加载算法列表 -const loadAlgorithms = async (repositoryId: string) => { - try { - // 这里应该根据仓库ID调用后端API获取算法列表 - // 暂时使用模拟数据 - algorithms.value = [ - { - id: 'algo-001', - name: 'ResNet图像分类', - description: '使用ResNet50模型进行图像分类', - repository_id: repositoryId, - entry_point: 'model/predict.py' - }, - { - id: 'algo-002', - name: 'MobileNet轻量分类', - description: '使用MobileNet进行轻量级图像分类', - repository_id: repositoryId, - entry_point: 'model/mobilenet_predict.py' - } - ] - console.log('算法列表加载完成') - } catch (error) { - console.error('加载算法列表失败:', error) - ElMessage.error('加载算法列表失败') } } // 仓库选择变化 const onRepositoryChange = (repositoryId: string) => { if (repositoryId) { - algorithms.value = [] - serviceForm.algorithm_id = '' - loadAlgorithms(repositoryId) - } -} - -// 算法选择变化 -const onAlgorithmChange = (algorithmId: string) => { - if (algorithmId) { - // 可以根据算法ID自动填充一些默认值 - const selectedAlgorithm = algorithms.value.find(a => a.id === algorithmId) - if (selectedAlgorithm) { - // 自动生成服务名称 - if (!serviceForm.name) { - serviceForm.name = `${selectedAlgorithm.name}服务` + // 从选择的仓库中带出默认值 + const selectedRepo = repositories.value.find(r => r.id === repositoryId) + if (selectedRepo) { + // 填充仓库描述和地址 + serviceForm.repository_description = selectedRepo.description || '' + serviceForm.repository_url = selectedRepo.repo_url || '' + + // 自动填充服务描述 + if (!serviceForm.description) { + serviceForm.description = selectedRepo.description || '' } + + console.log('从仓库中带出默认值:', selectedRepo) } + } else { + // 清空仓库信息 + serviceForm.repository_description = '' + serviceForm.repository_url = '' } } @@ -460,29 +424,24 @@ const submitForm = async () => { console.log('提交服务注册请求:', { repository_id: serviceForm.repository_id, - algorithm_id: serviceForm.algorithm_id, + repository_description: serviceForm.repository_description, + repository_url: serviceForm.repository_url, service_config: serviceConfig }) - // 这里应该调用后端API注册服务 - // 暂时使用模拟数据 - await new Promise(resolve => setTimeout(resolve, 3000)) - - // 模拟注册结果 - const mockService = { - service_id: `service-${Date.now()}`, + // 调用后端API注册服务 + const response = await axios.post('/api/services/register', { + repository_id: serviceForm.repository_id, name: serviceForm.name, version: serviceForm.version, - description: serviceForm.description, - status: 'running', + service_type: serviceForm.service_type, host: serviceForm.host, port: serviceForm.port, - api_url: `http://${serviceForm.host}:${serviceForm.port}`, - algorithm_id: serviceForm.algorithm_id, - repository_id: serviceForm.repository_id, - created_at: new Date().toISOString(), - last_heartbeat: new Date().toISOString() - } + timeout: serviceForm.timeout, + health_check_path: serviceForm.health_check_path + }) + + const mockService = response.data.service // 更新注册结果 registrationResult.success = true @@ -511,8 +470,6 @@ const resetForm = () => { if (serviceFormRef.value) { serviceFormRef.value.resetFields() } - // 重置算法列表 - algorithms.value = [] // 重置默认值 serviceForm.version = '1.0.0' serviceForm.service_type = 'http' @@ -524,6 +481,8 @@ const resetForm = () => { serviceForm.replicas = 1 serviceForm.health_check_path = '/health' serviceForm.health_check_interval = 30 + serviceForm.repository_description = '' + serviceForm.repository_url = '' } // 跳转到服务管理页面 @@ -582,6 +541,14 @@ onMounted(async () => { line-height: 1.4; } +.option-url { + font-size: 11px; + color: #666; + line-height: 1.3; + margin-top: 2px; + word-break: break-all; +} + .form-actions { display: flex; gap: 10px; diff --git a/frontend/src/views/admin/AdminUsersView.vue b/frontend/src/views/admin/AdminUsersView.vue index a2cdc21..5ac3608 100644 --- a/frontend/src/views/admin/AdminUsersView.vue +++ b/frontend/src/views/admin/AdminUsersView.vue @@ -10,7 +10,7 @@ @@ -38,11 +38,12 @@ + + + - - - - + + @@ -66,11 +67,12 @@ + + + - - - - + + @@ -85,41 +87,32 @@