From 1ccb116f80bff327622032b574ac90dbf6c301b4 Mon Sep 17 00:00:00 2001 From: v6ole Date: Fri, 29 May 2026 08:33:35 +0800 Subject: [PATCH] chore: add .gitignore, clean tracked junk files --- .gitignore | 53 + 4an-stop.sh | 39 - 4an.sh | 60 - 4an_deployment_guide.md | 162 --- 4an_supervisor.conf | 14 - CASDOOR_INTEGRATION_GUIDE.md | 454 ------- CASDOOR_SETUP.md | 188 --- app/.env | 5 +- app/__pycache__/app.cpython-312.pyc | Bin 4640 -> 0 bytes app/__pycache__/config.cpython-312.pyc | Bin 2546 -> 0 bytes app/app.py | 7 + app/config.py | 24 +- app/logs/app.log | 1101 ----------------- .../__pycache__/__init__.cpython-312.pyc | Bin 8814 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 8693 -> 0 bytes .../update/__pycache__/zte.cpython-312.pyc | Bin 11132 -> 0 bytes .../update/__pycache__/zte.cpython-313.pyc | Bin 11274 -> 0 bytes app/static/captcha.png | Bin 5360 -> 0 bytes app/templates/login.html | 12 +- .../__pycache__/casdoor_auth.cpython-312.pyc | Bin 10147 -> 0 bytes .../__pycache__/db_utils.cpython-312.pyc | Bin 6159 -> 0 bytes .../error_handlers.cpython-312.pyc | Bin 7143 -> 0 bytes .../__pycache__/file_utils.cpython-312.pyc | Bin 920 -> 0 bytes .../__pycache__/file_utils.cpython-313.pyc | Bin 915 -> 0 bytes app/utils/__pycache__/lzmx.cpython-312.pyc | Bin 3711 -> 0 bytes app/utils/__pycache__/lzmx.cpython-313.pyc | Bin 3695 -> 0 bytes app/utils/__pycache__/reward.cpython-312.pyc | Bin 1067 -> 0 bytes app/utils/__pycache__/reward.cpython-313.pyc | Bin 1007 -> 0 bytes app/utils/__pycache__/rewards.cpython-313.pyc | Bin 696 -> 0 bytes .../__pycache__/update_zte.cpython-313.pyc | Bin 10384 -> 0 bytes app/utils/__pycache__/wechat.cpython-313.pyc | Bin 1191 -> 0 bytes app/utils/casdoor_auth.py | 28 + app/utils/db_utils.py | 39 + app/views/__pycache__/about.cpython-312.pyc | Bin 629 -> 0 bytes app/views/__pycache__/about.cpython-313.pyc | Bin 616 -> 0 bytes app/views/__pycache__/auth.cpython-312.pyc | Bin 6701 -> 0 bytes app/views/__pycache__/auth.cpython-313.pyc | Bin 2430 -> 0 bytes .../__pycache__/dashboard.cpython-312.pyc | Bin 10131 -> 0 bytes app/views/__pycache__/device.cpython-312.pyc | Bin 16432 -> 0 bytes app/views/__pycache__/device.cpython-313.pyc | Bin 16353 -> 0 bytes app/views/__pycache__/history.cpython-312.pyc | Bin 7641 -> 0 bytes app/views/__pycache__/history.cpython-313.pyc | Bin 7508 -> 0 bytes app/views/__pycache__/manual.cpython-312.pyc | Bin 5699 -> 0 bytes app/views/__pycache__/manual.cpython-313.pyc | Bin 5634 -> 0 bytes .../__pycache__/statistics.cpython-312.pyc | Bin 16372 -> 0 bytes .../__pycache__/statistics.cpython-313.pyc | Bin 15751 -> 0 bytes app/views/__pycache__/user.cpython-312.pyc | Bin 4160 -> 0 bytes .../__pycache__/work_order.cpython-312.pyc | Bin 20417 -> 0 bytes .../__pycache__/work_order.cpython-313.pyc | Bin 15154 -> 0 bytes app/views/auth.py | 34 +- start_with_env.sh | 6 - uwsgi.log | 407 ------ uwsgi.pid | 1 - 53 files changed, 189 insertions(+), 2445 deletions(-) create mode 100644 .gitignore delete mode 100755 4an-stop.sh delete mode 100755 4an.sh delete mode 100755 4an_deployment_guide.md delete mode 100755 4an_supervisor.conf delete mode 100644 CASDOOR_INTEGRATION_GUIDE.md delete mode 100644 CASDOOR_SETUP.md delete mode 100644 app/__pycache__/app.cpython-312.pyc delete mode 100644 app/__pycache__/config.cpython-312.pyc delete mode 100644 app/logs/app.log delete mode 100644 app/scripts/models/__pycache__/__init__.cpython-312.pyc delete mode 100755 app/scripts/models/__pycache__/__init__.cpython-313.pyc delete mode 100644 app/scripts/update/__pycache__/zte.cpython-312.pyc delete mode 100755 app/scripts/update/__pycache__/zte.cpython-313.pyc delete mode 100755 app/static/captcha.png delete mode 100644 app/utils/__pycache__/casdoor_auth.cpython-312.pyc delete mode 100644 app/utils/__pycache__/db_utils.cpython-312.pyc delete mode 100644 app/utils/__pycache__/error_handlers.cpython-312.pyc delete mode 100644 app/utils/__pycache__/file_utils.cpython-312.pyc delete mode 100755 app/utils/__pycache__/file_utils.cpython-313.pyc delete mode 100644 app/utils/__pycache__/lzmx.cpython-312.pyc delete mode 100755 app/utils/__pycache__/lzmx.cpython-313.pyc delete mode 100644 app/utils/__pycache__/reward.cpython-312.pyc delete mode 100755 app/utils/__pycache__/reward.cpython-313.pyc delete mode 100755 app/utils/__pycache__/rewards.cpython-313.pyc delete mode 100755 app/utils/__pycache__/update_zte.cpython-313.pyc delete mode 100755 app/utils/__pycache__/wechat.cpython-313.pyc delete mode 100644 app/views/__pycache__/about.cpython-312.pyc delete mode 100755 app/views/__pycache__/about.cpython-313.pyc delete mode 100644 app/views/__pycache__/auth.cpython-312.pyc delete mode 100755 app/views/__pycache__/auth.cpython-313.pyc delete mode 100644 app/views/__pycache__/dashboard.cpython-312.pyc delete mode 100644 app/views/__pycache__/device.cpython-312.pyc delete mode 100755 app/views/__pycache__/device.cpython-313.pyc delete mode 100644 app/views/__pycache__/history.cpython-312.pyc delete mode 100755 app/views/__pycache__/history.cpython-313.pyc delete mode 100644 app/views/__pycache__/manual.cpython-312.pyc delete mode 100755 app/views/__pycache__/manual.cpython-313.pyc delete mode 100644 app/views/__pycache__/statistics.cpython-312.pyc delete mode 100755 app/views/__pycache__/statistics.cpython-313.pyc delete mode 100644 app/views/__pycache__/user.cpython-312.pyc delete mode 100644 app/views/__pycache__/work_order.cpython-312.pyc delete mode 100755 app/views/__pycache__/work_order.cpython-313.pyc delete mode 100755 start_with_env.sh delete mode 100644 uwsgi.log delete mode 100644 uwsgi.pid diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d9bb7d --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +# Python +__pycache__/ +*.py[cod] +*.pyo +*.pyc +*.egg-info/ +dist/ +build/ + +# Virtualenv +venv/ +env/ +.venv/ + +# Environment +.env +.env.* +!.env.example +"app/.env copy" + +# Logs +*.log +logs/ + +# uWSGI +uwsgi.pid +uwsgi.sock +uwsgi.log + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Uploads (keep directory, ignore contents) +static/uploads/* +!static/uploads/.gitkeep + +# Supervisor +*.conf +!app/supervisor.conf + +# Backup +backup/ + +# Captcha +app/static/captcha.png diff --git a/4an-stop.sh b/4an-stop.sh deleted file mode 100755 index 6559b48..0000000 --- a/4an-stop.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# 激活虚拟环境 -VENV_PATH="/mnt/nfs/.venv" -if [ -d "$VENV_PATH" ]; then - source "$VENV_PATH/bin/activate" -else - echo "虚拟环境路径不存在:$VENV_PATH" - exit 1 -fi - -# 定义 uWSGI 的启动配置文件路径 -INI_FILE="/opt/1panel/docker/compose/4an/app/uwsgi.ini" - -# 定义 uWSGI 的 PID 文件路径 -PID_FILE="/opt/1panel/docker/compose/4an/uwsgi.pid" - -# 定义日志文件路径 -LOG_FILE="/opt/1panel/docker/compose/4an/uwsgi.log" - -# 检查配置文件是否存在 -if [ ! -f "$INI_FILE" ]; then - echo "uWSGI 配置文件不存在:$INI_FILE" - exit 1 -fi - -# 检查 PID 文件是否存在 -if [ -f "$PID_FILE" ]; then - echo "停止 uWSGI 服务..." - uwsgi --stop "$PID_FILE" - if [ $? -eq 0 ]; then - echo "uWSGI 服务已成功停止。" - else - echo "停止 uWSGI 服务失败,请检查 PID 文件:$PID_FILE" - exit 1 - fi -else - echo "PID 文件不存在,跳过停止服务步骤。" -fi \ No newline at end of file diff --git a/4an.sh b/4an.sh deleted file mode 100755 index 9361d9a..0000000 --- a/4an.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# 激活虚拟环境 -VENV_PATH="/mnt/nfs/.venv" -if [ -d "$VENV_PATH" ]; then - source "$VENV_PATH/bin/activate" -else - echo "虚拟环境路径不存在:$VENV_PATH" - exit 1 -fi - -# 定义 uWSGI 的启动配置文件路径 -INI_FILE="/opt/1panel/docker/compose/4an/app/uwsgi.ini" - -# 定义 uWSGI 的 PID 文件路径 -PID_FILE="/opt/1panel/docker/compose/4an/uwsgi.pid" - -# 定义日志文件路径 -LOG_FILE="/opt/1panel/docker/compose/4an/uwsgi.log" - -# 检查配置文件是否存在 -if [ ! -f "$INI_FILE" ]; then - echo "uWSGI 配置文件不存在:$INI_FILE" - exit 1 -fi - -# 检查 PID 文件是否存在 -if [ -f "$PID_FILE" ]; then - echo "停止 uWSGI 服务..." - uwsgi --stop "$PID_FILE" - if [ $? -eq 0 ]; then - echo "uWSGI 服务已成功停止。" - else - echo "停止 uWSGI 服务失败,请检查 PID 文件:$PID_FILE" - exit 1 - fi -else - echo "PID 文件不存在,跳过停止服务步骤。" -fi - -# 等待 2 秒,确保服务已完全停止 -sleep 2 - -# 启动 uWSGI 服务 -echo "启动 uWSGI 服务..." -uwsgi --ini "$INI_FILE" --pidfile "$PID_FILE" --logto "$LOG_FILE" -if [ $? -eq 0 ]; then - echo "uWSGI 服务已成功启动。" -else - echo "uWSGI 服务启动失败,请检查日志:$LOG_FILE" - exit 1 -fi - -# 检查 PID 文件是否重新生成 -if [ -f "$PID_FILE" ]; then - echo "uWSGI 服务已成功重启。" -else - echo "uWSGI 服务启动失败,PID 文件未生成。" - exit 1 -fi diff --git a/4an_deployment_guide.md b/4an_deployment_guide.md deleted file mode 100755 index f07f683..0000000 --- a/4an_deployment_guide.md +++ /dev/null @@ -1,162 +0,0 @@ -# 4AN项目部署指南 - -## 环境变量配置 - -配置文件`app/config.py`已更新为支持环境变量。所有配置项可通过环境变量设置,包括: - -- `SECRET_KEY`: 应用密钥 -- `DATABASE_URI`: 数据库连接URI -- `LZMX_WEBHOOK_URL`: 临猪消息Webhook -- `UPLOAD_FOLDER`: 文件上传目录 -- `KEY110_DB_HOST`: 1key110数据库主机 -- `KEY110_DB_USER`: 1key110数据库用户 -- `KEY110_DB_PASSWORD`: 1key110数据库密码 -- `KEY110_DB_DATABASE`: 1key110数据库名称 - -## 使用Supervisor管理项目 - -### 安装依赖 - -项目需要安装python-dotenv包以支持环境变量: - -```bash -/mnt/nfs/.venv/bin/pip install python-dotenv -``` - -### 环境变量文件 - -我们已创建环境变量文件 `/opt/1panel/docker/compose/4an/4an.env`,其中包含所有配置参数: - -``` -# 应用密钥 -SECRET_KEY= - -# 数据库连接 -DATABASE_URI=mysql+pymysql://4an:GtbJp6Ai5azntnTB@10.10.10.253/4an - -# 临猪消息Webhook -LZMX_WEBHOOK_URL=http://imtwo.zdxlz.com/im-external/v1/webhook/send?key=ef1dc605827f425e96491ce5725b5274 - -# 文件上传目录 -UPLOAD_FOLDER=static/uploads - -# 1key110数据库配置 -KEY110_DB_HOST=10.10.10.253 -KEY110_DB_USER=1key110 -KEY110_DB_PASSWORD=KzdKtf7KfkXe7iCN -KEY110_DB_DATABASE=1key110 -``` - -在启动应用前需要加载这些环境变量: - -```bash -# 加载环境变量文件 -export $(cat /opt/1panel/docker/compose/4an/4an.env | grep -v '^#' | xargs) -``` - -### 配置Supervisor - -1. 确保修改app/config.py使其支持环境变量后,再使用Supervisor管理应用 - -2. 将`4an_supervisor.conf`文件复制到Supervisor配置目录: - -```bash -sudo cp 4an_supervisor.conf /etc/supervisor/conf.d/ -``` - -3. 在配置文件目录中创建一个启动脚本,用于加载环境变量并启动应用: - -```bash -sudo nano /opt/1panel/docker/compose/4an/start_with_env.sh -``` - -脚本内容: - -```bash -#!/bin/bash -# 加载环境变量 -export $(cat /opt/1panel/docker/compose/4an/4an.env | grep -v '^#' | xargs) - -# 启动uwsgi -exec /mnt/nfs/.venv/bin/uwsgi --ini /opt/1panel/docker/compose/4an/app/uwsgi.ini -``` - -设置脚本权限: - -```bash -sudo chmod +x /opt/1panel/docker/compose/4an/start_with_env.sh -``` - -4. 修改Supervisor配置使用该脚本: - -```bash -sudo nano /etc/supervisor/conf.d/4an_supervisor.conf -``` - -将command行修改为: - -``` -command=/opt/1panel/docker/compose/4an/start_with_env.sh -``` - -5. 更新Supervisor配置: - -```bash -sudo supervisorctl reread -sudo supervisorctl update -``` - -6. 管理4an服务: - -```bash -# 启动服务 -sudo supervisorctl start 4an - -# 停止服务 -sudo supervisorctl stop 4an - -# 重启服务 -sudo supervisorctl restart 4an - -# 查看服务状态 -sudo supervisorctl status 4an - -# 查看日志 -sudo tail -f /opt/1panel/docker/compose/4an/supervisor.log -``` - -## 使用systemd(可选) - -如果需要使用systemd而不是Supervisor,可以创建服务文件: - -```bash -sudo nano /etc/systemd/system/4an.service -``` - -服务文件内容示例: - -```ini -[Unit] -Description=4AN Application -After=network.target - -[Service] -User=root -WorkingDirectory=/opt/1panel/docker/compose/4an/app -ExecStart=/mnt/nfs/.venv/bin/uwsgi --ini /opt/1panel/docker/compose/4an/app/uwsgi.ini -Restart=always -StandardOutput=file:/opt/1panel/docker/compose/4an/systemd.log -StandardError=file:/opt/1panel/docker/compose/4an/systemd_error.log -EnvironmentFile=/opt/1panel/docker/compose/4an/4an.env - -[Install] -WantedBy=multi-user.target -``` - -然后启用并启动服务: - -```bash -sudo systemctl daemon-reload -sudo systemctl enable 4an -sudo systemctl start 4an -``` \ No newline at end of file diff --git a/4an_supervisor.conf b/4an_supervisor.conf deleted file mode 100755 index f4def63..0000000 --- a/4an_supervisor.conf +++ /dev/null @@ -1,14 +0,0 @@ -[program:4an] -command=/mnt/nfs/.venv/bin/uwsgi --ini /opt/1panel/docker/compose/4an/app/uwsgi.ini -directory=/opt/1panel/docker/compose/4an/app -user=root -autostart=true -autorestart=true -stopasgroup=true -killasgroup=true -redirect_stderr=true -stdout_logfile=/opt/1panel/docker/compose/4an/supervisor.log -stdout_logfile_maxbytes=10MB -stdout_logfile_backups=5 -environment=PYTHONPATH="/opt/1panel/docker/compose/4an/app" -environment_file=/opt/1panel/docker/compose/4an/.env \ No newline at end of file diff --git a/CASDOOR_INTEGRATION_GUIDE.md b/CASDOOR_INTEGRATION_GUIDE.md deleted file mode 100644 index 3ec116a..0000000 --- a/CASDOOR_INTEGRATION_GUIDE.md +++ /dev/null @@ -1,454 +0,0 @@ -# Casdoor 集成经验总结 - -本文档总结了在 Flask 项目中集成 Casdoor 并使用现有登录页面时遇到的所有问题和解决方案,帮助后续项目避免踩坑。 - -## 目录 - -1. [集成方式选择](#集成方式选择) -2. [配置步骤](#配置步骤) -3. [常见问题与解决方案](#常见问题与解决方案) -4. [最佳实践](#最佳实践) -5. [代码示例](#代码示例) - ---- - -## 集成方式选择 - -### 方式一:OAuth 重定向方式(不推荐用于现有登录页面) - -**特点:** -- 用户点击登录后跳转到 Casdoor 登录页面 -- 登录成功后回调到项目 -- 适合新项目或不需要保留现有登录页面的场景 - -**缺点:** -- 无法使用项目现有的登录页面 -- 用户体验不够统一 - -### 方式二:API 方式(推荐) - -**特点:** -- 使用 OAuth 2.0 password grant 方式 -- 在项目现有登录页面输入用户名密码 -- 通过 API 直接验证,无需跳转 -- 用户体验更好,界面统一 - -**推荐使用方式二** - ---- - -## 配置步骤 - -### 1. 环境变量配置 - -在 `.env` 文件或系统环境变量中添加: - -```bash -# Casdoor 服务地址 -CASDOOR_ENDPOINT=https://your-casdoor-server.com - -# Casdoor 应用配置(在 Casdoor 管理界面创建应用后获取) -CASDOOR_CLIENT_ID=your_client_id -CASDOOR_CLIENT_SECRET=your_client_secret - -# 组织名称和应用名称(通常在 Casdoor 中配置) -CASDOOR_ORGANIZATION_NAME=your_organization -CASDOOR_APPLICATION_NAME=your_application - -# 会话 Cookie 配置(跨域 SSO 时建议设置) -SESSION_COOKIE_SAMESITE=Lax # 或 None(跨域时) -SESSION_COOKIE_SECURE=False # HTTPS 时设为 True -``` - -### 2. 在 Casdoor 中创建应用 - -1. 登录 Casdoor 管理界面 -2. 进入 "Applications" 页面 -3. 创建新应用,记录 `Client ID` 和 `Client Secret` -4. **重要**:确保应用启用了 password grant 方式(如果 Casdoor 版本支持) - -### 3. 代码集成 - -参考项目中的以下文件: -- `app/utils/casdoor_auth.py` - Casdoor 认证工具类 -- `app/views/auth.py` - 认证路由处理 -- `app/templates/login.html` - 登录页面模板 - ---- - -## 常见问题与解决方案 - -### 问题 1:登录后提示 "Please log in to access this page" - -**原因:** -- Flask-Login 的默认提示消息是英文 -- 登录成功后可能有残留的 flash 消息 - -**解决方案:** - -在 `app.py` 中配置 Flask-Login: - -```python -login_manager = LoginManager() -login_manager.init_app(app) -login_manager.login_view = 'login' -login_manager.login_message = '请先登录以访问此页面' # 设置中文提示 -login_manager.login_message_category = 'info' -``` - -在登录成功后清除 flash 消息: - -```python -# 在 auth.py 的登录成功处理中 -session.pop('_flashes', None) -``` - -在模板中过滤已登录用户的未登录提示: - -```html - -{% with messages = get_flashed_messages() %} - {% if messages %} - {% for message in messages %} - {% if not (current_user.is_authenticated and '请先登录' in message) %} - - {% endif %} - {% endfor %} - {% endif %} -{% endwith %} -``` - -### 问题 2:API 登录返回 "Unauthorized operation" - -**原因:** -- 使用了错误的 API 端点 -- 参数格式不正确 -- 未使用 OAuth 2.0 password grant 方式 - -**解决方案:** - -使用正确的 OAuth 2.0 password grant 端点: - -```python -login_url = f"{endpoint}/api/login/oauth/access_token" - -data = { - 'grant_type': 'password', # 必须指定 grant_type - 'username': username, - 'password': password, - 'client_id': client_id, # 必须包含 client_id - 'client_secret': client_secret, # 必须包含 client_secret - 'scope': 'openid profile email phone' -} -``` - -**注意:** 某些 Casdoor 版本可能不支持 password grant,需要检查 Casdoor 文档或使用 OAuth 授权码方式。 - -### 问题 3:退出时跳转到 Casdoor 404 页面 - -**原因:** -- 退出时尝试跳转到 Casdoor 的退出页面 -- Casdoor 退出 URL 不正确 - -**解决方案:** - -如果不需要同时退出 Casdoor,只退出本地会话: - -```python -@app.route('/logout') -@login_required -def logout(): - logout_user() - return redirect(url_for('login')) -``` - -如果需要同时退出 Casdoor,使用正确的退出 URL: - -```python -# 注意:需要确保 redirect_uri 在 Casdoor 应用的回调白名单中 -logout_url = f"{casdoor_endpoint}/login/oauth/logout?client_id={client_id}&redirect_uri={login_url}" -``` - -### 问题 4:语法错误 - try-except 块不匹配 - -**原因:** -- 代码重构时 try 块未正确闭合 -- 在 try 块外使用了 try 块内定义的变量 - -**解决方案:** - -确保所有逻辑都在完整的 try-except 块中: - -```python -try: - # 所有逻辑代码 - response = requests.post(...) - result = response.json() - # ... 处理逻辑 - return result -except requests.exceptions.Timeout: - # 处理超时 - return None -except requests.exceptions.RequestException as e: - # 处理请求异常 - return None -except Exception as e: - # 处理其他异常 - return None -``` - -**检查要点:** -- 每个 `try` 必须有对应的 `except` 或 `finally` -- 变量作用域要正确(在 try 块内定义的变量不能在块外使用) - -### 问题 5:API 响应格式解析错误 - -**原因:** -- Casdoor API 返回格式可能不同 -- 未处理各种可能的响应格式 - -**解决方案:** - -兼容多种响应格式: - -```python -result = response.json() - -# 检查错误 -if isinstance(result, dict) and result.get('status') == 'error': - error_msg = result.get('msg', '未知错误') - return None - -# 尝试多种格式获取 token -access_token = None -if isinstance(result, dict): - # 标准 OAuth 2.0 格式 - access_token = result.get('access_token') - - # Casdoor 格式 {"status": "ok", "data": {...}} - if not access_token and result.get('status') == 'ok': - token_data = result.get('data', {}) - if isinstance(token_data, dict): - access_token = token_data.get('access_token') - - # 其他可能的字段 - if not access_token: - access_token = result.get('token') or result.get('accessToken') -``` - -### 问题 6:用户信息同步问题 - -**原因:** -- Casdoor 返回的用户信息字段名可能不同 -- 本地数据库字段映射不正确 - -**解决方案:** - -使用多个可能的字段名: - -```python -# 从 Casdoor 用户信息中提取数据 -casdoor_id = user_info.get('sub') or user_info.get('id') or user_info.get('name') -phone = user_info.get('phone') or user_info.get('phoneNumber') or casdoor_id -name = user_info.get('name') or user_info.get('displayName') or username -branch = user_info.get('affiliation', '') -role = user_info.get('type', '') -``` - -### 问题 7:会话 Cookie 配置问题 - -**原因:** -- 跨域时 Cookie 无法正确设置 -- SameSite 和 Secure 属性配置不当 - -**解决方案:** - -在 `config.py` 中配置: - -```python -# 跨域 SSO 时 -SESSION_COOKIE_SAMESITE = 'None' # 需要配合 Secure=True -SESSION_COOKIE_SECURE = True # HTTPS 必须 - -# 同域时 -SESSION_COOKIE_SAMESITE = 'Lax' -SESSION_COOKIE_SECURE = False # HTTP 开发环境 -``` - -**注意:** `SameSite=None` 必须配合 `Secure=True` 使用,且需要 HTTPS。 - ---- - -## 最佳实践 - -### 1. 错误处理 - -- 始终使用 try-except 包裹 API 调用 -- 记录详细的错误日志,便于排查 -- 对用户显示友好的错误提示 - -```python -try: - result = casdoor_auth.login_with_password(username, password) - if not result: - flash('用户名或密码错误') - return render_template('login.html') -except Exception as e: - app.logger.error(f"登录异常: {str(e)}") - flash('登录失败,请稍后重试') - return render_template('login.html') -``` - -### 2. 日志记录 - -- 记录登录尝试(不记录密码) -- 记录 API 调用结果 -- 记录用户信息同步情况 - -```python -app.logger.info(f"尝试 Casdoor API 登录: username={username}") -app.logger.info(f"Casdoor 用户信息: {user_info}") -app.logger.info(f"用户 {user.name}({user.phone}) 通过 Casdoor API 登录成功") -``` - -### 3. 安全性 - -- 永远不要在日志中记录密码 -- 使用 HTTPS(生产环境) -- 验证和清理用户输入 -- 使用环境变量存储敏感配置 - -### 4. 用户体验 - -- 提供清晰的错误提示 -- 登录成功后清除残留的提示消息 -- 保持登录页面的原有样式 - -### 5. 代码组织 - -- 将 Casdoor 相关逻辑封装在独立的工具类中 -- 保持路由处理简洁 -- 使用配置类管理所有配置项 - ---- - -## 代码示例 - -### 完整的认证工具类结构 - -```python -# app/utils/casdoor_auth.py -class CasdoorAuth: - def __init__(self, app=None): - self.app = app - if app: - self.init_app(app) - - def init_app(self, app): - """初始化应用配置""" - self.endpoint = app.config.get('CASDOOR_ENDPOINT') - self.client_id = app.config.get('CASDOOR_CLIENT_ID') - self.client_secret = app.config.get('CASDOOR_CLIENT_SECRET') - self.organization_name = app.config.get('CASDOOR_ORGANIZATION_NAME', 'built-in') - self.application_name = app.config.get('CASDOOR_APPLICATION_NAME', 'app-built-in') - - def login_with_password(self, username, password): - """使用用户名和密码通过 API 登录""" - login_url = f"{self.endpoint}/api/login/oauth/access_token" - data = { - 'grant_type': 'password', - 'username': username, - 'password': password, - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'scope': 'openid profile email phone' - } - - try: - response = requests.post(login_url, data=data, timeout=10) - # ... 处理响应 - except Exception as e: - # ... 错误处理 - return None - - def get_user_info(self, access_token): - """使用访问令牌获取用户信息""" - # ... 实现 - pass -``` - -### 登录路由处理 - -```python -# app/views/auth.py -@app.route('/login', methods=['GET', 'POST']) -def login(): - if current_user.is_authenticated: - return redirect(url_for('dashboard')) - - if request.method == 'POST': - username = request.form.get('username', '').strip() - password = request.form.get('password', '').strip() - - if not username or not password: - flash('请输入用户名和密码') - return render_template('login.html') - - # 使用 API 方式登录 - result = casdoor_auth.login_with_password(username, password) - - if not result: - flash('用户名或密码错误') - return render_template('login.html') - - # 处理用户信息同步 - user_info = result.get('user_info', {}) - # ... 创建或更新用户 - - login_user(user) - session.pop('_flashes', None) # 清除残留提示 - return redirect(url_for('dashboard')) - - return render_template('login.html') -``` - ---- - -## 检查清单 - -在集成 Casdoor 时,确保完成以下检查: - -- [ ] 环境变量配置正确 -- [ ] Casdoor 应用已创建并获取 Client ID 和 Secret -- [ ] 使用正确的 API 端点(`/api/login/oauth/access_token`) -- [ ] 使用 OAuth 2.0 password grant 方式 -- [ ] 所有 try-except 块正确闭合 -- [ ] 错误处理完善,有详细的日志记录 -- [ ] 登录成功后清除残留的 flash 消息 -- [ ] 用户信息同步逻辑正确 -- [ ] 会话 Cookie 配置正确(跨域时) -- [ ] 登录页面样式保持一致 -- [ ] 测试各种错误场景(错误密码、网络错误等) - ---- - -## 参考资源 - -- [Casdoor 官方文档](https://casdoor.org/docs/overview) -- [OAuth 2.0 Password Grant](https://oauth.net/2/grant-types/password/) -- [Flask-Login 文档](https://flask-login.readthedocs.io/) - ---- - -## 总结 - -集成 Casdoor 到现有项目时,主要注意以下几点: - -1. **选择正确的集成方式**:API 方式更适合保留现有登录页面 -2. **使用正确的 API 端点和参数**:OAuth 2.0 password grant 方式 -3. **完善的错误处理**:处理各种异常情况和响应格式 -4. **用户体验优化**:清除残留提示,保持界面统一 -5. **安全性考虑**:使用 HTTPS,不在日志中记录敏感信息 - -遵循以上实践,可以避免大部分常见问题,顺利完成 Casdoor 集成。 - diff --git a/CASDOOR_SETUP.md b/CASDOOR_SETUP.md deleted file mode 100644 index 34c03c9..0000000 --- a/CASDOOR_SETUP.md +++ /dev/null @@ -1,188 +0,0 @@ -# Casdoor 集成配置指南 - -本文档将指导您如何配置 Casdoor 作为项目的登录认证系统。 - -## 前置条件 - -1. 已通过 1Panel 部署 Casdoor 服务 -2. Casdoor 服务可以正常访问 -3. 拥有 Casdoor 管理员权限 - -## 第一步:在 Casdoor 中创建应用 - -1. **登录 Casdoor 管理界面** - - 访问您的 Casdoor 地址(例如:`http://your-server:8000`) - - 使用管理员账户登录(默认:`admin` / `123`) - -2. **创建应用(Application)** - - 进入 "Applications" 页面 - - 点击 "Add" 按钮创建新应用 - - 填写以下信息: - - **Name**: 应用名称(例如:`4an-app`) - - **Display name**: 显示名称(例如:`4AN 工单管理系统`) - - **Organization**: 选择组织(默认:`built-in`) - - **Enable password**: 是否启用密码登录(根据需要选择) - - **Enable sign up**: 是否允许注册(根据需要选择) - -3. **配置回调 URL(Redirect URI)** - - 在应用配置中找到 "Redirect URLs" 或 "Redirect URI" - - 添加您的应用回调地址,例如: - ``` - http://your-app-server:18061/callback - ``` - - 如果有多个环境,可以添加多个回调地址 - -4. **记录应用凭证** - - 创建应用后,Casdoor 会生成: - - **Client ID**: 客户端 ID - - **Client Secret**: 客户端密钥 - - 请妥善保存这些信息,后续配置需要使用 - -## 第二步:配置项目环境变量 - -在您的环境变量文件(`.env` 或系统环境变量)中添加以下配置: - -```bash -# Casdoor 配置 -CASDOOR_ENDPOINT=http://your-casdoor-server:8000 -CASDOOR_CLIENT_ID=your_client_id_here -CASDOOR_CLIENT_SECRET=your_client_secret_here -CASDOOR_ORGANIZATION_NAME=built-in -CASDOOR_APPLICATION_NAME=your_app_name -CASDOOR_REDIRECT_URI=http://your-app-server:18061/callback -``` - -### 配置说明 - -- `CASDOOR_ENDPOINT`: Casdoor 服务的完整地址(不包含路径) -- `CASDOOR_CLIENT_ID`: 在 Casdoor 中创建应用时获得的 Client ID -- `CASDOOR_CLIENT_SECRET`: 在 Casdoor 中创建应用时获得的 Client Secret -- `CASDOOR_ORGANIZATION_NAME`: 组织名称(默认:`built-in`) -- `CASDOOR_APPLICATION_NAME`: 应用名称(与 Casdoor 中创建的应用名称一致) -- `CASDOOR_REDIRECT_URI`: 回调地址,必须与 Casdoor 应用中配置的 Redirect URI 完全一致 - -## 第三步:安装依赖 - -确保已安装所有必要的 Python 依赖: - -```bash -pip install -r requirements.txt -``` - -主要依赖包括: -- `requests`: 用于与 Casdoor API 通信 -- `Flask-Login`: 用于会话管理 -- 其他项目依赖 - -## 第四步:在 Casdoor 中创建用户 - -1. **创建用户** - - 进入 Casdoor 的 "Users" 页面 - - 点击 "Add" 创建新用户 - - 填写用户信息: - - **Name**: 用户名(唯一标识) - - **Display name**: 显示名称 - - **Email**: 邮箱(可选) - - **Phone**: 手机号(建议填写,用于与本地用户表关联) - - **Password**: 密码 - - **Organization**: 选择组织 - -2. **关联用户到应用** - - 在用户详情页面,确保用户属于正确的组织 - - 用户登录后会自动同步到本地数据库 - -## 第五步:测试登录 - -1. **启动应用** - ```bash - python app/app.py - # 或使用 uwsgi/supervisor 启动 - ``` - -2. **访问登录页面** - - 访问 `http://your-app-server:18061/login` - - 您应该看到两个登录选项: - - "使用 Casdoor 登录" 按钮(如果配置了 Casdoor) - - 手机号登录表单(备用方案) - -3. **测试 Casdoor 登录** - - 点击 "使用 Casdoor 登录" 按钮 - - 应该重定向到 Casdoor 登录页面 - - 使用 Casdoor 中的用户账户登录 - - 登录成功后应该重定向回应用并自动登录 - -## 用户信息同步 - -当用户通过 Casdoor 首次登录时,系统会: - -1. 从 Casdoor 获取用户信息 -2. 检查本地数据库中是否存在该用户(通过手机号匹配) -3. 如果不存在,创建新用户记录 -4. 如果存在,更新用户信息(姓名、支局、角色等) - -用户信息映射: -- `phone`: 从 Casdoor 的 `phone` 或 `phoneNumber` 字段获取 -- `name`: 从 Casdoor 的 `name` 或 `displayName` 字段获取 -- `branch`: 从 Casdoor 的 `affiliation` 字段获取 -- `role`: 从 Casdoor 的 `type` 字段获取 - -## 故障排查 - -### 问题:点击 Casdoor 登录按钮没有反应或报错 - -**解决方案**: -1. 检查环境变量是否正确配置 -2. 检查 `CASDOOR_ENDPOINT` 是否可以访问 -3. 检查 `CASDOOR_CLIENT_ID` 和 `CASDOOR_CLIENT_SECRET` 是否正确 -4. 查看应用日志获取详细错误信息 - -### 问题:登录后回调失败 - -**解决方案**: -1. 确保 `CASDOOR_REDIRECT_URI` 与 Casdoor 应用中配置的完全一致 -2. 检查回调地址是否可以从 Casdoor 服务器访问 -3. 检查防火墙和网络配置 - -### 问题:无法获取用户信息 - -**解决方案**: -1. 检查 Casdoor 应用配置中的 Scope 是否包含 `openid profile email phone` -2. 检查用户是否有正确的权限 -3. 查看应用日志中的详细错误信息 - -### 问题:用户信息同步失败 - -**解决方案**: -1. 确保 Casdoor 用户信息中包含手机号(phone) -2. 检查数据库连接是否正常 -3. 查看应用日志获取详细错误信息 - -## 安全建议 - -1. **保护 Client Secret** - - 不要将 `CASDOOR_CLIENT_SECRET` 提交到代码仓库 - - 使用环境变量或密钥管理服务存储敏感信息 - -2. **使用 HTTPS** - - 生产环境建议使用 HTTPS - - 更新 `CASDOOR_ENDPOINT` 和 `CASDOOR_REDIRECT_URI` 为 HTTPS 地址 - -3. **定期更新密码** - - 定期更新 Casdoor 管理员密码 - - 定期轮换 Client Secret - -4. **监控日志** - - 定期检查应用日志,关注认证失败的情况 - - 设置告警机制 - -## 更多信息 - -- Casdoor 官方文档:https://casdoor.org/docs/overview -- Casdoor GitHub:https://github.com/casbin/casdoor - -## 注意事项 - -1. 如果未配置 Casdoor(未设置 `CASDOOR_CLIENT_ID`),系统会自动使用原有的手机号登录方式 -2. 两种登录方式可以并存,用户可以选择使用哪种方式登录 -3. 用户信息会从 Casdoor 同步到本地数据库,确保数据一致性 - diff --git a/app/.env b/app/.env index 0b7456c..cca9afa 100755 --- a/app/.env +++ b/app/.env @@ -2,7 +2,7 @@ SECRET_KEY=kU/W5y3uFbWuK1x+RTTOPgLp38yM6Z7d # 数据库连接 -DATABASE_URI=mysql+pymysql://4an:GtbJp6Ai5azntnTB@10.10.10.14/4an +SQLALCHEMY_DATABASE_URI=mysql+pymysql://4an:GtbJp6Ai5azntnTB@10.10.10.14/4an # 量子密信消息Webhook LZMX_WEBHOOK_URL=http://imtwo.zdxlz.com/im-external/v1/webhook/send?key=ef1dc605827f425e96491ce5725b5274 @@ -41,4 +41,5 @@ CASDOOR_CLIENT_ID=8f323670e073612794ef CASDOOR_CLIENT_SECRET=bc37d89f9220fe5a46c17125c731d2daf22f1299 CASDOOR_REDIRECT_URI=https://zd.dhdx.fun/callback CASDOOR_ORGANIZATION_NAME=dahua -CASDOOR_APPLICATION_NAME=4an \ No newline at end of file +CASDOOR_APPLICATION_NAME=4an +PROJECT_NAME=4an \ No newline at end of file diff --git a/app/__pycache__/app.cpython-312.pyc b/app/__pycache__/app.cpython-312.pyc deleted file mode 100644 index f972e37b7f6c5a3f895e9055b56fdd60de3333db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4640 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 diff --git a/app/__pycache__/config.cpython-312.pyc b/app/__pycache__/config.cpython-312.pyc deleted file mode 100644 index b97e1105fb496c99817d778507e2fd520a7614e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2546 zcmbVOPi)#&7`MR?LV+ff1V{+UI<;LoB_>nVWvt6az-gcaQbUy1hguG%Nhrb0K)WC< zO1D;0M&P)3&^~)si6DPTMs;8n<)IxaS%gJcG>TBtQx-+%WRwg=WJp-H zR!Nhr;|MFigs|9}tn8%Z^JuSPM>2f9DA*I_7?x(aWH@#{RDqQquykoW{7o*E3L_NC zB9x3pDR~%+lqgm*DvyZvNn5g58Ki?nbpI2Puc2jcjhL!|d9f;*YHk3fsG-!XlG@V% zvWZpIcxq-4w)rcR(l&rsS1UJw+4CG2&2wP1RSc`Uf>F8#817|TYF*je0Is!Kk!ooG zrLUn{8$j)24KpZvULyy!}OS`Mvv}eOsCsr~`zPB!ct_;`ELQaswKdBj^}*1PFS9 zbb}TzHFk=gB!)-*{u9vS9Rb>jaj)OuqDTB*7eS_Vi6oPp4dJP{bgU(Y;L(Kuc_cm! zR>6n{ou*ejn{~j1g(oRBASw?3;}NQ#HvkKJIlp z>vA+qJl0#aEgTn9Hn2VnJp zJ4gVzmw5-YJsl;S6C?o?BTN*w1WWR%u&>tyR5Tr9=E5`$)HFTEv8kw}YiRoI6cepP znrL`4g`iu;B|sCrp=Nn52ISM>Bxp+UOpN8`cN4sVo%v@v@rC*DQt#2%P3f7){ zBp1oYa}xbWhuqG7OZzOv&%v!YeG=-zEX zOdWL`1p7(RNJ=zJ9eH(5o!8}b!Xdk8dR@TU3KnbLlk?<#IiK+IuxN1#n7Poi|GN5` z`nv9#PQX2PJz~$KfOQqRU&yC(>HI=&LFga7+b?#X7BEYpvny}U+4DoWA>r^_!f;6J zWChFw8wb-Xtr7Z0?kYs9PwLJS<$gIXTD-qo$a@x2v;>7yXYN_f+{4T~UR{q~j6VQ% zpe+9)@zRM>UafvfE9Kds_DFTCyorbSSD-2V+a#o&uq#JV^be%@PsI8_iJ+QG+JBW@ MD2@JuNV0_g4^;3~IsgCw diff --git a/app/app.py b/app/app.py index d986968..801aa30 100755 --- a/app/app.py +++ b/app/app.py @@ -16,6 +16,7 @@ import logging from logging.handlers import RotatingFileHandler import os from utils.error_handlers import ErrorHandler +from utils.db_utils import retry_database_connection def create_app(): # 创建应用实例 @@ -49,6 +50,12 @@ def create_app(): # 初始化数据库 db.init_app(app) + + # 确保数据库连接成功后再继续启动 + app.logger.info("正在连接数据库...") + if not retry_database_connection(db, app): + raise RuntimeError("无法连接到数据库,应用启动失败") + migrate = Migrate(app, db) # 初始化异常处理器 diff --git a/app/config.py b/app/config.py index da16bee..32a1a95 100755 --- a/app/config.py +++ b/app/config.py @@ -1,7 +1,14 @@ import os +from pathlib import Path from dotenv import load_dotenv -# 加载.env文件 (相对于应用根目录) +# 尽量兼容多种 .env 放置方式 +BASE_DIR = Path(__file__).resolve().parent.parent # /home/.../4an +# 1. 优先加载项目根目录 .env +load_dotenv(BASE_DIR / '.env') +# 2. 兼容放在 app 目录下的 .env +load_dotenv(BASE_DIR / 'app' / '.env') +# 3. 再加载一次默认搜索路径(当前工作目录及其父级) load_dotenv() @@ -10,7 +17,18 @@ class Config: 环境变量优先级高于默认值,可在系统环境变量中设置这些参数 """ SECRET_KEY = os.environ.get('SECRET_KEY', os.urandom(24)) - SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') + # 优先读取 SQLALCHEMY_DATABASE_URI,兼容旧配置;否则回退到 DATABASE_URI + SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI') or os.environ.get('DATABASE_URI') + SQLALCHEMY_ENGINE_OPTIONS = { + 'pool_pre_ping': True, # 每次取连接前验证是否可用 + 'pool_recycle': 1800, # 连接空闲 30 分钟后自动回收重建 + 'pool_timeout': 10, # 等待连接池超时(秒) + 'connect_args': { + 'connect_timeout': 5, # 连接 MySQL 超时 + 'read_timeout': 15, # 读取超时 + 'write_timeout': 15, # 写入超时 + }, + } LZMX_WEBHOOK_URL = os.environ.get('LZMX_WEBHOOK_URL') SQLALCHEMY_TRACK_MODIFICATIONS = False UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', 'static/uploads') @@ -31,6 +49,8 @@ class Config: CASDOOR_ORGANIZATION_NAME = os.environ.get('CASDOOR_ORGANIZATION_NAME', 'built-in') CASDOOR_APPLICATION_NAME = os.environ.get('CASDOOR_APPLICATION_NAME', 'app-built-in') CASDOOR_REDIRECT_URI = os.environ.get('CASDOOR_REDIRECT_URI', 'http://localhost:18061/callback') + # 项目名称(用于与 Casdoor 用户标签匹配权限) + PROJECT_NAME = os.environ.get('PROJECT_NAME') # 会话 Cookie 配置(跨域 SSO 时建议设置) SESSION_COOKIE_SAMESITE = os.environ.get('SESSION_COOKIE_SAMESITE', 'Lax') diff --git a/app/logs/app.log b/app/logs/app.log deleted file mode 100644 index 791b358..0000000 --- a/app/logs/app.log +++ /dev/null @@ -1,1101 +0,0 @@ -2025-12-11 10:07:58 INFO: 应用启动 -2025-12-11 10:07:58 INFO: 错误处理器初始化完成 -2025-12-11 10:08:14 INFO: 尝试 Casdoor API 登录: username=19977899008, application=4an, organization=dahua -2025-12-11 10:08:14 WARNING: Casdoor API 登录返回格式异常,未找到 token: {'status': 'error', 'msg': 'Unauthorized operation', 'data': None, 'data2': None} -2025-12-11 10:08:14 WARNING: Casdoor API 登录失败: 用户名 19977899008 -2025-12-11 10:09:03 INFO: 应用启动 -2025-12-11 10:09:03 INFO: 错误处理器初始化完成 -2025-12-11 10:14:14 INFO: 应用启动 -2025-12-11 10:14:14 INFO: 错误处理器初始化完成 -2025-12-11 10:15:02 INFO: 尝试 Casdoor OAuth password grant 登录: username=19977899008 -2025-12-11 10:15:02 INFO: Casdoor 用户信息: {'sub': '798f4436-fbb6-45f4-bf0c-6e1cf4add605', 'iss': 'https://casdoor.dhdx.fun', 'aud': '8f323670e073612794ef', 'preferred_username': 'weijuesen', 'name': '韦矍森', 'email': 'voole@vip.qq.com', 'email_verified': True, 'picture': 'https://cdn.casbin.org/img/casbin.svg', 'phone': '19977899008', 'groups': ['dahua/yunzhongtai'], 'roles': ['admin']} -2025-12-11 10:15:02 INFO: 更新用户信息: 韦矍森(19977899008) -2025-12-11 10:15:02 INFO: 用户 韦矍森(19977899008) 通过 Casdoor API 登录成功 -2025-12-11 10:15:02 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:15:12 INFO: 用户 韦矍森(19977899008) 登出 -2025-12-11 10:15:17 INFO: 尝试 Casdoor OAuth password grant 登录: username=19977899008 -2025-12-11 10:15:17 INFO: Casdoor 用户信息: {'sub': '798f4436-fbb6-45f4-bf0c-6e1cf4add605', 'iss': 'https://casdoor.dhdx.fun', 'aud': '8f323670e073612794ef', 'preferred_username': 'weijuesen', 'name': '韦矍森', 'email': 'voole@vip.qq.com', 'email_verified': True, 'picture': 'https://cdn.casbin.org/img/casbin.svg', 'phone': '19977899008', 'groups': ['dahua/yunzhongtai'], 'roles': ['admin']} -2025-12-11 10:15:17 INFO: 更新用户信息: 韦矍森(19977899008) -2025-12-11 10:15:17 INFO: 用户 韦矍森(19977899008) 通过 Casdoor API 登录成功 -2025-12-11 10:15:17 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:18:38 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:18:51 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:21:32 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:21:32 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:21:54 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:21:54 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:21:59 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:21:59 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:22:26 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:22:26 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:22:30 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:22:30 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:22:32 INFO: 用户 韦矍森(19977899008) 登出 -2025-12-11 10:22:36 INFO: 尝试 Casdoor OAuth password grant 登录: username=19977899008 -2025-12-11 10:22:36 INFO: Casdoor 用户信息: {'sub': '798f4436-fbb6-45f4-bf0c-6e1cf4add605', 'iss': 'https://casdoor.dhdx.fun', 'aud': '8f323670e073612794ef', 'preferred_username': 'weijuesen', 'name': '韦矍森', 'email': 'voole@vip.qq.com', 'email_verified': True, 'picture': 'https://cdn.casbin.org/img/casbin.svg', 'phone': '19977899008', 'groups': ['dahua/yunzhongtai'], 'roles': ['admin']} -2025-12-11 10:22:36 INFO: 更新用户信息: 韦矍森(19977899008) -2025-12-11 10:22:36 INFO: 用户 韦矍森(19977899008) 通过 Casdoor API 登录成功 -2025-12-11 10:22:36 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:22:36 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:22:47 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:22:59 INFO: 应用启动 -2025-12-11 10:22:59 INFO: 错误处理器初始化完成 -2025-12-11 10:23:13 INFO: 尝试 Casdoor OAuth password grant 登录: username=19977899008 -2025-12-11 10:23:13 INFO: Casdoor 用户信息: {'sub': '798f4436-fbb6-45f4-bf0c-6e1cf4add605', 'iss': 'https://casdoor.dhdx.fun', 'aud': '8f323670e073612794ef', 'preferred_username': 'weijuesen', 'name': '韦矍森', 'email': 'voole@vip.qq.com', 'email_verified': True, 'picture': 'https://cdn.casbin.org/img/casbin.svg', 'phone': '19977899008', 'groups': ['dahua/yunzhongtai'], 'roles': ['admin']} -2025-12-11 10:23:13 INFO: 更新用户信息: 韦矍森(19977899008) -2025-12-11 10:23:13 INFO: 用户 韦矍森(19977899008) 通过 Casdoor API 登录成功 -2025-12-11 10:23:13 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:23:21 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:23:21 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:23:32 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 10:23:54 INFO: 用户 韦矍森 访问统计页面 -2025-12-11 10:24:01 INFO: 用户 韦矍森(19977899008) 登出 -2025-12-11 14:49:05 INFO: 尝试 Casdoor OAuth password grant 登录: username=19977899008 -2025-12-11 14:49:05 INFO: Casdoor 用户信息: {'sub': '66d04f8e-e663-4ee1-a2e9-5777901c6df7', 'iss': 'https://casdoor.dhdx.fun', 'aud': '8f323670e073612794ef', 'preferred_username': 'weijuesen', 'name': '韦矍森', 'email': 'voole@vip.qq.com', 'email_verified': True, 'picture': 'https://cdn.casbin.org/img/casbin.svg', 'phone': '19977899008', 'real_name': '韦矍森', 'groups': ['dahua/yunzhongtai'], 'roles': ['admin']} -2025-12-11 14:49:05 INFO: 更新用户信息: 韦矍森(19977899008) -2025-12-11 14:49:05 INFO: 用户 韦矍森(19977899008) 通过 Casdoor API 登录成功 -2025-12-11 14:49:05 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 15:22:53 INFO: 用户 韦矍森 访问仪表盘页面 -2025-12-11 22:20:35 INFO: 应用启动 -2025-12-11 22:20:35 INFO: 错误处理器初始化完成 -2025-12-11 22:20:52 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:20:53 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:20:54 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:20:55 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:20:56 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:20:56 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:20:57 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:20:58 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:00 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:02 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:04 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:05 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:06 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:09 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:19 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:20 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:21 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:22 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:23 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:24 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:25 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:26 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:28 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:32 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:34 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:35 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:36 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:38 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:39 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:39 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:41 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:42 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:44 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:44 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:50 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:51 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:53 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:55 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:56 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:57 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:58 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:21:59 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:22:01 ERROR: 未处理异常: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? -Traceback (most recent call last): - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request - rv = self.dispatch_request() - ^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/4an/app/views/auth.py", line 17, in login - return redirect(url_for('casdoor_login')) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/helpers.py", line 239, in url_for - return current_app.url_for( - ^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for - return self.handle_url_build_error(error, endpoint, values) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for - rv = url_adapter.build( # type: ignore[union-attr] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/home/v6ole/pyproject/venv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build - raise BuildError(endpoint, values, method, self) -werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'casdoor_login'. Did you mean 'casdoor_callback' instead? - -2025-12-11 22:23:19 INFO: 应用启动 -2025-12-11 22:23:19 INFO: 错误处理器初始化完成 -2025-12-11 22:23:29 INFO: 重定向到 Casdoor 授权页面 -2025-12-11 22:23:38 INFO: 应用启动 -2025-12-11 22:23:38 INFO: 错误处理器初始化完成 -2025-12-11 22:23:51 INFO: Casdoor 用户信息: {'sub': '66d04f8e-e663-4ee1-a2e9-5777901c6df7', 'iss': 'https://casdoor.dhdx.fun', 'aud': '8f323670e073612794ef', 'preferred_username': 'weijuesen', 'name': '韦矍森', 'email': 'voole@vip.qq.com', 'email_verified': True, 'picture': 'https://cdn.casbin.org/img/casbin.svg', 'phone': '19977899008', 'real_name': '韦矍森', 'roles': ['admin']} -2025-12-11 22:23:51 INFO: 更新用户信息: 韦矍森(19977899008) -2025-12-11 22:23:51 INFO: 用户 韦矍森(19977899008) 通过 Casdoor 登录成功 -2025-12-11 22:23:51 INFO: 用户 韦矍森 访问仪表盘页面 diff --git a/app/scripts/models/__pycache__/__init__.cpython-312.pyc b/app/scripts/models/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b722db02c02e62f613724143e254f5917b35ba25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8814 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 J5mtWU{{>CuK$rjk diff --git a/app/scripts/update/__pycache__/zte.cpython-313.pyc b/app/scripts/update/__pycache__/zte.cpython-313.pyc deleted file mode 100755 index 492c5dee8f3865208418c594c3ec73396847aacd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11274 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 diff --git a/app/static/captcha.png b/app/static/captcha.png deleted file mode 100755 index 261d8414fc86a3f1e9865ebdcdc7b31dd1851a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5360 zcmbW4cTm&Ko4~&`sRE%00vejn^} z0cC*V#trftWEAA&
YR5VOCX{f1bZZj~_G2LMU-@U`e!NJM%kdKo~h?|3h|M3H% zN1_rE5@0?V1!*z)hvE`q|7=1;Nl8gVO~ZQgCac&zj(cMN=ODBLAPPX6h?Rth3m^s& zk${K@-vIFSImw9r6~KQ65itoV*$r|EN-FB>gc^E)n23agn3RN!jFj{`JLGyDAO(>z z+!Iy0!KhFw*sj*O0tPfY%r`m?aOw7jy4TU+1V+dnuwIzBl) z`-h7NAo(}e_4seF|G@>i<{~B~B_SpMhl_|f;JTB5NXhPr-e6GDA-C~j*A4s00?mSw&>_& zd0{vN)nW(XJgb9g-GC|F6rAi5{9-PV6#jbY{T|U;wKYdj0<4X=R98|UB-P}!F*|gV zgGR^biu8#sf}ZYU(Xag4zgZG^Ttpk8SN5Z_k*kv>Q`${g36<#M^aJLoab1fI!yU^( zcOGrW3@AlJRoLN%eo8wozdp+2P!Gy?UUE~zgz>~xD}77lrP;Vt&wk-Sl4NaZfc1nJ zj7h!ZvvMLO0XY2WFnqI7Pyp^vrEp~@Cf;vk80C?u72(zmQNmdS2R@q z<;Sz77j-9Q9;+lD@JML57B}OdC7RjyBF$jD%nrGA1+K4T$w@pLtuVefxY10#rfa$0MbNSd#zzh|3GGWDO_QVHso&G68H!=~HgSpP6?%z0R?(et z2`7K5Vlm?^K;Ui7%qj!yPKAOFHu%<|P zH1haXLUqsiW^(*SeVh_rAKWQZfPXIX__0`%KS*4q0LQet&o|BN{ubcRFUWaWnlCoM zl}}sJ9mO3WJCGmI-o6}NB zx%%m=OsT_*qSUGEA8h$+Q_;zT-;)!cTz%7VZ-?usGKE65as56~tkOK-AHKzH4ym+o zCtJB5ITk|#5C%>Me+$F8%#zOA50k;_DB2dc?$?3mY-yaXNM-4sPYwndG{(ujapX~z zaEEG_&?iaO_U-jN zv+32Qo0~(u$GjzZ5gsB73^dkj)Ho$7U%f})KRQl007vf^`SNpg3STT9AH&;lEzze( zCFz?>S<}vLunfVF&$~_gz2pZMUKY%Ucv**xOr^atW`p3Ic7xVl)#Akkk-%~nnUsQB zvUm7qhS+ZLZ40|+7^3vc;ifhk$9jwo_u2v}q;1rxt2ckY z_5rcQ|53U^JgY04t!ar)VmUjHSXLvq49eZ#Fs1*N@D!=`=uMvD5p#??qDCIda|y>s zeLE1DApnqG-Psw(t`cfjXC`W_Bz3OoYBi?iDacpv`Tj4o-M#&%3BS|Jath6z>CMfn z7fk*j+ix!Q)%h#DfYmd{mA-BZR?FS-M4*fsCeV=vxtcjrgJVKoiNU@rsFp9)6*bQ2 zmX`K;x@wNf1EyJa&4foSEn*T`>2}EPf!3G7BO_jH$jWwvFtYdiz3q+oprHwm(#5zb zN)B5MgGodMEo`q#v(%+xZTv*qHEKoT;0b!FLZVa_{%n8qxV_q}Zcnt00F>}+Vs2yC z3dhf0u}^Hj-;Vzy{7|Jgg zZvSEHzHyJ+Aw=nS;T_8bkCT1u7O&;NJy68KfF|6@$??6PP`F7@%eNln>A`0@`n44U znCMYudqN&{ZmAp*<9gbocXMmHJj$2?O5kjvnp1R$Y5?wO!k#w>-7pM#yJB0<28rRR z<}jV1?||-99$dUE2nogch#eXrJiVaV@vZN2R?(}^_}&lzRKDFgKx!D z9xC-L8V9N9xw7qB_9Y+nxRFI4&=(e%f36;yX zwb<4s1N*E--VYDA{$0FuI}hEuV14Apq+QZ^Kl?s&$7EOGdYbqtLMFq1fIAMDCjd&= zrh4u@_+qTgWSGxJn1LwQGyeQ9tcJHRvgR(-)VT+)lIJQ{t0zVmXX9OCUrkN>TG!bR?j`X@1yug%9){cgCvpqEpAm?wRCIO2XLVsjOO5$rM&mc$#z zWLJioU9PO1A!OIv)opsH*+k}nGWGJQ$kI-_%%gL}1(6nTA?Dn*;U$hROT$m`_K_F6 zf#bpBRn6k?)n^{8uM$2+iIf{cG9cN`uH!y)lRUTPZ;2JTWm)?SSX9@<4Pxb9UaiwO zO^jk&^2KUvLXK`qLG{ijPPxxA{gJjp5|eq0f$Ujvc*G!t3KhQzqqpCO+nq{8UqDc< z>9twk{J~m1J9)Sg(iF1U87ad7`OO-ZeZFDc=K*(0p7RcEjj3s@(_z2Bg_p*eI}PgJhZQ)xzH3)uO- zPOZ)**m?+tMIGxfxzjn4J)SvoQ@T!+R3hcj3A|g)Tf*qWwizkR9f+NNpxE zKtw4n`J=V9Z$7H&U03T(FH9G@cdNFFFI^ve7%l(qETGE`%BITJ!xpK^N_7J$mTkcd zxqVS00AQ)j73g+c!7fHBKqJuk&NqZ#w-+w>t%tSD9o-}Kn!YEqbRRgJj=drxd+bIs zTfDAvQ6W`(j-p}>$$)P`Caqug^Pf(De5qs{wjiZSA8}t4VXMvDjfBJgrF=V_Hyxoa`m5rAdt!oIdBcQQP`R(XI;eL-jMdD zK>1y+UR-CXLyx^vOWXj@{;k=IjSR12ltK~ox!T~HLIp+1*agN$_F(={28(Ab(wlRq zZ^w*L2H;kiY&jAu6U7fD+x+uaux5eWNR_unoKANSv-5td!d)6ezEim0<~7(54a@Z&V_f|BkvxZ3I%w~i?PM*`4VXL(JYScT|h?*MUu$k{a3=`Odxstz~a zM$vhGF;KhST)C+kr?^&iLND26bFFSp{CgY%G+w>wzR+mijaxkL^`<*LDAt>EUgpmN5oF2~P6}5^Uk=R7F&yBjbcA;UOviTQnmJx@AzOGhP z&Pb9UiF9I5gHq+ktU#%3JiWi91^0t4zSh9g6-tC;nRFon7C>jqzGSJEnRIsI_zazV z(ee;_|Dw3cS;{nWH+&rYaC~OL#5+I^;pFmlkn0mksF@qD?lD zLE3vfV!T$Wa)a8hQXj(wUl{V+>8s-MKNU}yM%E;AX)IIG%~~yZd@S~V%~{o){LLgU zO`4j&+ePU3Hb#|6mn3`F;%6MYt2gEQIiFCk1kr8;TW7pQL#%G_SRB`nJSlol3=Sf& zg$jQ#;Z})>S7ZL*^JhS6ezji|Y#ayCO7TjpNiVVe{W4{{dJT^Km8fQwky1r`jBzPq z{vF|t$5e5x@^K)qxJu1mfI3m;W|I*sz2pzo%t$#HPbc^ac^78IEelGb&pY1*2O9_~ zgdPN;i!CpsI+iW%AwsU}Jt)sda~2(8%s+a`9lXgroNt`#)Q7L1^zk;6rVsuuJ@Grk zF4dMi^jI^rvaV2%7XxQ1ulJN%e8ynjVMw$}CI?|At*I8u!CxIlHXSI|>ByQ^uOBAa zk>&|F9-kEVt!^OL$|Y6@iwX}EabtRNaeCDADWYxBL{=^OXrnt*eJO6hOrX5O z!(&(S^LvU98rYSwEv1lZ<`y$-ePpx0#t_C#&flgYwW0;-VkhW+k>Rgkl zGIyvs-7&c86GhrE$;jku$p%+f=Iq8!sy|TOpro1HpaqGhA_=&i+nm7a_vGLp0${pj z+)t}7C}NYvRwPKtU|{j=ht;H}yB0M~(SZ#XwO@Jsb7E&`4=wbwq1`4|>yTTtde+re zxE6I@l#JhJ->SS5gGXHYp?w^jUq=i@^0NMEx+2v#nlfjZ6MvPs$lgxQJsi=&oSvyV zmip>%NASVdr5*whR}0;MK`Yom&QiB{hS*O3D!8n4bJzCjD}9UY7;3T1NA*=Emw$Ym$~aZ=z3L8{gK?_prTdAw^M?B= zL&qL{h#VsNkE!?lj<2`k&x>WOyo_1=SyD4&t=86g>Aru&^^78NT1SNqLb0R1_RSgY zHYufB6Q5$|HcXC8X;B_tLQ$8t3?T%7$G&b}k@ypgSqa=1;3}^h-wcqSE+oQOOv28a z0@DdVO(-Peb8_visCR4zHCZ`91)3te8hnGRGi zgI|i)Pou_J)Q3n_DEZbAmj;sYk)KW-TH%GV-=c+2uN6zza4f7P--5k`>$jSWXA}Fn zbbgrqp&57#Nm`i$Jjy%j^0pcyDsR}}}%@qP=lzzmbD4L%ao z0NJUkXcrd{DYg@T2mr-t)p>qZ-xS*P3}omviElM}7ZM`i45rh8|Si^wJ7gtlkh*OG5n2T%%%Q3QWGu1L$-tKNnsVblZ4}`z` zP>PPz3Dp|!yS;{--bLH>Eg>*l2p5)vY z4;a1<19P@v>{F5@`;wPQku85~+(Im_(_Y(-^F$qx802HLDajsO_X2C+%#vjt4lSc| iu{H(xi4*~UrfMB^ivILId$O?ghD%juUM3>Kum1q}u1Yrm diff --git a/app/templates/login.html b/app/templates/login.html index 0edc9f6..8179c7c 100755 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -26,10 +26,14 @@

正在跳转至 Casdoor 登录页,如未跳转请点击按钮。

diff --git a/app/utils/__pycache__/casdoor_auth.cpython-312.pyc b/app/utils/__pycache__/casdoor_auth.cpython-312.pyc deleted file mode 100644 index bd20ef1c284f9bc2143095af0a0ac917d0ea04ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10147 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 diff --git a/app/utils/__pycache__/db_utils.cpython-312.pyc b/app/utils/__pycache__/db_utils.cpython-312.pyc deleted file mode 100644 index 8dddca41fbef417f518b09941bc62485826cfa05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6159 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 D3e~hc diff --git a/app/utils/__pycache__/file_utils.cpython-312.pyc b/app/utils/__pycache__/file_utils.cpython-312.pyc deleted file mode 100644 index a065af92629628249331f084c76a7fea5304bade..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmZ8f&1(}u6rb7Mq%r*hMO26;AVRm4u0kv*Vko81LL0>*DY=Agc5HXqukLJOA}dX? z(iTB`tD>OCmU!qNApQeh8mqJ{deTyI6YHrb->k`6`d}Wvd2fDi-q)w@?l=N@TEDD5 z!3h0em$q;%aCiy8I#Q5=b!6Z?#z^6oP@YpF3crN&d{q#mP4-yCeq`K`XGyWmWmW+W z59e?i6vV+EDx(T^u3+RL4Sqc-3Rbv!D}usZ0Jp~YC#2rGd$^3IkjQ6`@L-cg6FEQX zP+M1BKcZU?i35h%163!cY!LsntTUrhAQhLGRJBY>*+skMm9;&ze zk9m*RBLA$%wTIpCszpN>0xcH85VXetqvEyB&>R8}dE9&a|5cR}`4Vfx{_|%CA2#=2 ze>_-ShPCLJFUc^FYF3OotVCb1Y-0MS+_{o5W6G-T$L|p;8!$C<*6)}Y&W_~oO!)$p z%S06XxXQMwV9V~DA2Z}ifvS&))5`+!sxeDhr&1seOVRHsT88ZqN(%waIS)owFTDw> zhJMC-U-Yl`ujO~*soKb%(6KzZIJwsMW^^|(&`1pICen>W`ipR#dBzsUR`T!8)yBRG zqSFoZtjLL6^Bc6+VT;+k4+;|G?~YFdg#|kh{J4n%LXgr??3Q6EC7s-ME&_oKik<=W Vi^mv$M`wQv7*FFrQ33Y{q`#BS%2EIT diff --git a/app/utils/__pycache__/file_utils.cpython-313.pyc b/app/utils/__pycache__/file_utils.cpython-313.pyc deleted file mode 100755 index d555636498dc63b2588e25aa31fffad824c653a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 915 zcmZWn&1(}u6rb7Me3&*ZD1w$q7AcY~rFclh`c+CPwAx15C8X3qSkq~`Wp}fkNwoFS z6c4ou+Dk!E5Iosij~>Lop)o?rpeI{OZesB6n>B%w{$L*OV}5Vm$F!o+2m)k32bP{; zgnkL51F5aFR8V%1fed^P-Nh8E$dCpQm5hKP51?gC<)Wemo8r2Ld0^Txi=@zD3$Fr4 zhSORE0hw?H-30A6PJk3JuOOtN4AP;7ZW!2*QtfPp6o9ZUa&;lqwli2{9z>d)=6Iwj z@@WzeQs&uKnFs9B6GFieUbJlDnhxP-O8u?$_L4foVVuD(lRNO zb4k<9Rmzsla)O)p)e&!v_jVEpH|+(gD34tQQAGzmecOqxu|`k!&FY8sx9gwS-grHJ zZEvL(A8o|PYVompe0+a0TZ?D+m23+*sBp47(XKzakD%G+&v;896MMM;w@VgN_4ULJqhJ$m=`cxw}W zL};aA!t~eDT9ArnxKi?n%g>aTD$XOkOqKXb9{jY~! z3~kTXBWiWxKnZQmZp>~c-cL4S!?oCOBbKbilHZk-h)iuvJ)f^meN!|V1#()GG^zOm zhDtAj+01}|^5h58Gk#nC?)~?6kx%$vQ23TpTBz9M4!r~fu^x5~#BUj6{1cu3qhLIT L{{|I2dKcq*M1! z7-wY0nexvN273}}7jSJdI0LZ@xMe~bnsk7E>lbO9j@>Jr$uyR2eX0u0OvnAww_jdRFcKrv7g+)+Kj#UTlS`hl0Jg7yJQ=T+{GJrV5Q6Y3NTT=%q zc-Dk8Va-7eg*fdAbWqFbKY8=yGT6-~Fnh$IqU zDM6j8E!J@q*GmTVImoEmVja)-G;SWt#p-6_OwhFGqiSP0g+g7HY9x`bQ%ViOtGkVo zO?~F9l3mr~#>Fog(x^Ix4!|sT8;={iY}vY#>O{x12T&*FDcZMSZWAIBACcVB>tEr8~j{kPvg9;ksJRUAw2Hc5h4VkG@g-vM6WN#MH_0^y&9=)nuZ`|b73;pSychjdYq<-0#x^-&icUNaWIWzn2t<<%N`8%U6?%g+x zG9ya(Fxg%*gZZDtcu|57Q9+bsoiZOZ7Yj#4xd{6LBJVvcV6Q0oq?jlhUq0sNqh#V_ zI*J1kN!CIr4=bBG`9mFo@U}OGLoh5~gbVRlHgf#YfS>mUIN6j_l}~VR0SFj@mcv*G zdk zH-OfVsM-o@W94+^nn6#-L|bYzG~;0ZPMd6ch+M(arH@J~2VUrZVcJ|i?WlZYFCD1p zuNZ8fwAcK@pmVTim<)@I_9^76I zZvT>Ld1Q0^D?>x$f>;h8GPdKzwdnp@W2;?ze{*@OS^L0DgYGX(TCyn>pfnZ&g~RGQ$EgeJSO1Ej}{oy6`U z!VN-Z5Bp*v$xBiauPHPTGMICDq%_O6T>6HDEH{<(#5E*TEfLRw5J}(pv;+kckjg8R zj0^iBF<j&S0T-x|l3f3j6Hi5AojO(VHTawN#iH4Uaox2lN z?O@(RvT@zu8=$U#HXCgQl8r3MMvIb-&hI-LCw9D8hwj%ITg$cgo6B2^wGWDE(EaL_ z0VV+DvvIyK8#PBzw>D03+Lhq)5_+==p*P^IZe2GW*Dib5>y+%H<21?NAzIzj6nf94 zgIwkqIQ%J&CGnJ8r8sj=w}9Q6(`}#^<#hYvwSX&D;|0maUsB>)wG|?le0w&l$NzHK z%Q+U~44Hu-r9cop5QOY(r39_2wphdUM6;O9!Q#ahRg3G@xZ`Dcf&krurK-nbt&R__ zC*?qpGPOmyo-h)b8l`Y6q)JtfGiv;02*Mm^x>f=~pe`UtMFBx%vm`{lxzkgOkqOQW z_g{0rqiJ!+2&hvhe_BA9LrVMmXWg?`##8;*Q+G#G=P%CP8=k*;b@uFNs{bte*Pajl z*FQEFZT8L=5Dlo23Yc6qVgx17z`9d+f0euUT)a)(iu^)28sa6Md&YJ4%EwQ+ zTBC3X2O>wFb?iL{Uy+3&iD}7UBiDB|^gZ+G$1Ix}zHrK&>ODX6X>Y3UeEP!^@X4vs zpQX-Dz*}sZ;4taxV9q%-mu6*9{-xn+r2v~DJi1l7<@ScpZWrLZO3&%-uL z+La1vJ9+-?P?vIJ6Z3bRo#5RDKXDtdWhrVMWj(J?SGq@>$;!=-5k>FpwVg5al}$5_ zDW)>XR1WeZ?IYW-w_ZPbz2mk&v8v^d%#Mr}{4$JsKhoG-U%6^V-b%U}6V4`}ZnJCJ zRgu8J@Ronz0r4HJt0b5buo-zCLO5 zB&_Q*NVCB?<9u#7^z+c=$dt1w>1;|gzcT53HBt3iro?F3OJ!&?0l7^9`I_$&q6Oc$*s0C(cSm0tI uei!}$*vP+TBH0Hprxf)yvi%vE{(`C=>no_z$1SU<(kHvBsZzWPJpK&;EE|jf diff --git a/app/utils/__pycache__/lzmx.cpython-313.pyc b/app/utils/__pycache__/lzmx.cpython-313.pyc deleted file mode 100755 index e3e528c811df3ffabff9358933ed61c7b5a8477f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3695 zcmcJR|8EoL8NlE3* zbAhTqq+0o21e7u&N|#WP3fd0HhDuk~PQd;ETR}^9V^X!o36>_!G^#YQU-rCbpD`gD z+oZm-pL_0kpL^b~&*y#TY&H%-IkP!4aMOm+H{?YxhN3dp0?Jt=Ac5M6aN$W|3f>Jn z4Lc0j;6VaihcGQvfUFQ0kjwz(HRecw-Cjy%BOygpqH!^7EXE`cEBtBr&#k7k_>^F1 zrX-^PaRkP1up`0fXL_M-ei2OVMJxEQej23NUjdTyQ+CwKHB*A6$sn0{6wt?jdMoBf zL1;PhBfl|F>QgVfpiika!Mcf-SU=lqdD^eNX!4)|+cFd&W7CQWg_a>CnF9{pBG>~? zUH6+GkEGS0>mKBWS(eP5<^f0H*-!PO&9oc!Q{KwmkF4DZNf9Mw-JSzU@lj+~sQ&zSH~)AJ2~8%Kq{= z_!W!~ZhkQP(XE;Hu4TuEh_M@8&_ZMeAJ2Lauwd|$w2RFuio^4mmDl03v zpKLFc#p2IWqO3rOWI|Td3T-}^NGhI`)k++S%3`oTfrGLVQc|*N-nu_5CdtI9OcF;W zMWrE>ms2hK#Jz)w#B0G6jzPCVQY0o~)f^FDkA}ryG@@FHsx|~yBnkl~sOiUvcyKQU zeNeSx=tu&KLDDl!mRvQ(MOh9FX#JFv2}u@JN|Z?kdP+s*MPFa?KoTcj6~jtjTS)3l zDbbkR7keYVzbSb@b;_a?36i&9F&thE5lrxx{{UhLO*tCU?hR>s%TQ0=h@7=wTWj(L z%E3?Z&kYCii1LEAW|D8s@U7{#o(XXRk?T07=6-ekxy|oxp0d_Xx$5sbYtGfZTQ}S@;avI9RN>-|uz3!d zos;ac47=J9nx}5aw=GrbReaFgx9xl&PvJW+ew3Rc2Ei%NYF@%uB9t~>*xf{UK&V`QC>2wJBn$EKasz>Z zwU|R%wdyElY%EbgrIwL+B?;9?#3~RnX}gq(pkTsIb+MLl@sN}X#hy&OCa5MMl?_!Y>dwNIqrx^zPm7}tYw^(4O`!*58pY@Oh@r5k#{yq#p@>ft_6*F2q#4im{n zj%1@v%SQhD&c<Nc?3 zi@F2!%A)QJ5Kd@CsM2HhlFE6-PwTZ1x%yezte^V}<*?v-9I4d`6sZA<7=a?C+d;2= zUgPkp-AW7rGM8HEtI&EtAq(|ZTEl3Jk1BHdoRm9T*&x@wJ?CE3NUx(iNUw>RN+RTlwAR3^DbV`Br zO<;1vND-Vs1?S1${B`lVbM`uMs|+XN$(X2!k*8c|E`0oit33$^aa0<3+VSXd7)1ey zB&My1j$+#@pzZ0;Kjygn$jL*V?9mg`pC8ShI+6SEZ5VQP>=)T%kG>F%e|T;5s76 zhQUjTfRsjFvqoo?A(tz;fY)YHNpKC##1kn=nGamT{t|Etv|XancAqG|7CWF_)a24V z=SA@DhQHhle3_41*P@}9r|LbU{Jr|-qmCn{Db_W~)@RuIVR5u)bkpUo%dcM^ydF+3 z_5G3k!9yA?-H>PX%aOt1{@T5A^p%XeEzP$Bay#5p?v?4rjT!d~X?_zJd<8>$#@&(T zH-g~>Vi*l(-0f+;1Ku|_O*^ViwH)7f^39`f4!=C%@TTo+^2qQ!Kh3WiiJgzVFHQ38 z8NNN;@zMmpBi*nwUv0MSqVkNDP~4$WeEIiDak6@MY`$(5-DSD%R{CyLZFduWw}}DW zYb-3Yw!&onwL2vy=Nl%oeg(~eM1>V%UyLUrshGG0{}61j6i6l;AWu^i^$l|T8Cm{< Y8oo8wQ8nNCmQpoyTUJmtcnf&^3yHwxHUIzs diff --git a/app/utils/__pycache__/reward.cpython-312.pyc b/app/utils/__pycache__/reward.cpython-312.pyc deleted file mode 100644 index 564510080d7b4bffe6f6a9ce06f88a10e2d046d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1067 zcmah{OHUI~7`=D;ptLh!TENf{(tsEyMw$?GK?n(nOT|Q88B9|<(^@TUGo7N73<*Av zrv`jL4I*HoV$deAz+mwgxPiE^X;_%(w4D{zx?<&br;l{e#G9G#o_o(Z-~I06E5n!( zwDFC0|3M8xKgpofa1rE*WD#-b0lJDL%u*hzB!S)pzYhNVX9%Fe9L4Fxk{5CMjUwg@ zUdpHEjQ`;=SHqdA`fG{5Dq{u)bC#F-QA$QKHG%~!(K6s>sOcQKR)^3K)I6#i)yr7c z-LfMT!Lzii_fQyJMtUUCEED|>VzUEUdUYrLD6X#UWR~KY&4lu5MtL%u{j{8Uo5;r3 zGVw*_&4Mz$sZPwRua`B476t@gq*p^ENmvNoiy$j3b+|jJjDJukW)F9#%3=*%;>D;CtXNAk_Btxd(%kn;R+dr?usgK@0^nAH zI}5lQIsvX8rF8zFSM4jzk}DU8g{8Evgo#ivlAs|?p^qMiiS+84vh-1jPpPr3ww_ai zZH3K7>w(K8cGFvl?7N5AyU#LT=C!%>^B38BTgu8~Wo3oTk)+D__OHZ(3J9?{Whk77 zAw^f7Wy(}KuvDGE-*yXJ#N`PEy?$Sc9(Lbxm04qvB{h-@aU7j?-Utoz&XKdB0PhS- z#jMUAchKn$hn-Q;ABZ>$uCB0@YVz@-t1xt3m&%C+8zdxeI}RIcG;qV^yw2hsNmI0MQk?cUoEDsw92!(n5-nM7)MG)i4%Dz@^U~+6 zlKnqCB{?LfVSE#bZ^*F7P?FPQjnSj@c|0$OGs2AuHmu1Fmzn`mSaZTV>h}2n!ia}C zfa}&IEkF-AK|r<0r#_*aEo|%*9%YQpo#JYyxRupk&FfDWN?+EBZ?mP$W-;?Zf3vL5 zZ5h*x#_Khf9a17mA1mNUDDm5JNDZjzge>$WRYmj(N7I<1a5Sj~V<8lbjmLv3N~)>% zb2IwX2V;6+KR0U%*{iaeQew5-rr0MOJ=%E$h?yKT{Toim*&@9o| zm@!!Ok_S~th)A1D9TTBqC&omk!kRjcj>5*KzWPzm%o;1(-QKe!-POiYEyxwKxx#j~ z^zLEl-t*$uMblSUdRe-^t*<}U*Vl=UB-N)r|H&>Jh(M$?TeW|i#vQ#kjj3Od)~v{P zf=W0U2*qP#(TK)P1n&k8S$mBoHImC0G(qPuj%RAjaou~5d z6LZ4{HaK~q%mBw%usj$MDYM}Bppf@gTxc|Aa3UT~jmsC6cHEl1I1!XB6h&3&A&TNn F@jp0SC42w? diff --git a/app/utils/__pycache__/rewards.cpython-313.pyc b/app/utils/__pycache__/rewards.cpython-313.pyc deleted file mode 100755 index 51db9d88e80282ea84e92e0bb43a27e69f086059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 696 zcmey&%ge<81kSTBrEg$jV0aATzyKqZ@foCKDnl@X6hje1I-@32GEgNPfY{7H{CO9U zn92~!5X@*5!N8Cx#=sED7|dj41!MzFN@oW0Sl~QXAdd~sV@qcT>f=Dt#|f8XA*hcF zNgpozK&BwFNBwr}O6nB}&H#VJ=s0&C6L9il0lQ{7EeJ@epYI7Nqk9VLFz4zl+5Ci#JuFx zVo>NRDBMy^wTdaIgsO=#Nz98WEy>I&jwwnlPb^9))+?yIC6=CA5)a|WCsoG7Oeg|5 z4HT2btw5rI;Rd_#1#yGR>;^Zug(nnt+b$5g!7DmLs5@?f6M`WseuGo=f~3}EPA!nK zqHendN(foFdNgHtO`9QcnN#rwzu*mSp3gvsF!*UQf}K{x4dfIFfCxSyaf`zyH$SB` cC)KV<5Xc2P92Afrm>C%vKQjq2@`BX@0PN+r=Kufz diff --git a/app/utils/__pycache__/update_zte.cpython-313.pyc b/app/utils/__pycache__/update_zte.cpython-313.pyc deleted file mode 100755 index fa08563645a53d9d5762de3873bc02431fd57758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10384 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 DxZ3z= diff --git a/app/utils/__pycache__/wechat.cpython-313.pyc b/app/utils/__pycache__/wechat.cpython-313.pyc deleted file mode 100755 index a333037f09ebe8c88a84b86bf209cce97fceffc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1191 zcmZux&2Jk;6rcUF*X#JJb_jJ)vnjp!Knau_YBfj}DiuPiM7CCt9Ld_)6UW8bU1oOM zrY8p#$bqV%kQS^UKuQE$(f}2SqNpf;0gI^AXqy94vrZ#b;K~cSU02~E*kmm}# z?-~vG=;=yg_+iGgmC#8}6Y|1n=;^+Xh7W)YD$*b*bY?(ZL7)x-palvMKT-)7Vm{6X z{IjFr1nXlN3;?A^3*-Woh__BMlVF4!0Fz86YJEf4l6&pb{rc?g=Iriz!@aYz`|G#O z#SQn%?{_ygn!n67XKzVT4pnegl8Ib|6H~hWUeQ9eto%&QUgOF^kh{3*epT<#rc|w5 zgD5MzOIP;hKO#rF-+kuJU+rv`;e~1m7OUl~++6r@zp?mm<&L}b@!sYQ_u86tx#taC zGofa_bZ*9gm*c8o)T$-btm@j!=drFiya_LvPO#)fSw~4v?%J|@b-~NEUvKPvz5MrP zL+a)xhLz~FzV?&5@=0@U-peRkN#d1B2VNZ>;X(a_4C@4^am6GBAbQ8to`Px_BJA*G z)l|<}GI2j+lAQs%OFurmy_}WLzL^mn5yAH@h)u#YbZk0&rwO5KO&i#WBejZQaZ*P` zY^tV(ozUq^C1}uY9l=0V&2%_yqD;^U|L-bDHQs=oPHg1{K8Xmt0OH-^=y$`4^a8 IM1Ma20fGE?A^-pY diff --git a/app/utils/casdoor_auth.py b/app/utils/casdoor_auth.py index 95490db..4f23c89 100644 --- a/app/utils/casdoor_auth.py +++ b/app/utils/casdoor_auth.py @@ -108,6 +108,34 @@ class CasdoorAuth: pass # 如果无法记录日志,忽略错误 return None + def get_account_info(self, access_token): + """ + 使用访问令牌获取完整账户信息(包含标签等字段) + """ + account_url = f"{self.endpoint}/api/get-account" + headers = { + 'Authorization': f'Bearer {access_token}' + } + + try: + response = requests.get(account_url, headers=headers) + response.raise_for_status() + result = response.json() + + # Casdoor 通常返回 {"status": "ok", "data": {...}} + if isinstance(result, dict): + if result.get('status') == 'ok' and isinstance(result.get('data'), dict): + return result['data'] + if 'data' in result and isinstance(result.get('data'), dict): + return result['data'] + return result if isinstance(result, dict) else None + except requests.exceptions.RequestException as e: + try: + current_app.logger.error(f"获取 Casdoor 账户信息失败: {str(e)}") + except: + pass + return None + def verify_state(self, state): """ 验证 state 参数,防止 CSRF 攻击 diff --git a/app/utils/db_utils.py b/app/utils/db_utils.py index 2aa8339..e15f541 100755 --- a/app/utils/db_utils.py +++ b/app/utils/db_utils.py @@ -3,6 +3,7 @@ import time from flask import current_app import logging from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy import text from scripts.models import db from collections import defaultdict @@ -121,6 +122,44 @@ def clear_table_cache(table_name): if key in query_cache.access_times: del query_cache.access_times[key] +# 数据库连接重试机制 +def retry_database_connection(db_instance, app, max_retries=10, retry_delay=5): + """ + 尝试连接数据库,在连接失败时进行重试 + :param db_instance: SQLAlchemy数据库实例 + :param app: Flask应用实例 + :param max_retries: 最大重试次数 + :param retry_delay: 重试间隔(秒) + :return: 连接成功返回True,失败返回False + """ + import sqlalchemy.exc as sa_exc + + for attempt in range(max_retries): + try: + app.logger.info(f"尝试连接数据库... (尝试 {attempt + 1}/{max_retries})") + + # 使用with语句确保应用上下文正确 + with app.app_context(): + # 尝试建立连接 - SQLAlchemy 2.0 兼容方式 + with db_instance.engine.connect() as connection: + connection.execute(text("SELECT 1")) + connection.commit() # 确保事务提交 + + app.logger.info("数据库连接成功!") + return True + + except (sa_exc.OperationalError, sa_exc.DatabaseError, Exception) as e: + app.logger.warning(f"数据库连接失败: {str(e)}") + + if attempt < max_retries - 1: + app.logger.info(f"等待 {retry_delay} 秒后重试...") + time.sleep(retry_delay) + else: + app.logger.error(f"数据库连接失败,已重试 {max_retries} 次,放弃连接") + return False + + return False + # 通用查询函数,包含异常处理和缓存 @db_operation() @cache_query() diff --git a/app/views/__pycache__/about.cpython-312.pyc b/app/views/__pycache__/about.cpython-312.pyc deleted file mode 100644 index ad9273cec206f992025d23c2ae4cd746ce404c64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 629 zcmZWmze~eF6n>ZFO0{Se9dxoP3W3@z;v`PaU7YL^VsmQr(!@)uwkRkl`XAJPLHeh- z2o6fn$;r(Ur%t}RrYd-F?|tvb_rAy7!`Rp;;JNNDde7+JWiUKi2GRut9dN-V9DGtE zL}HC=zFyN2>sL@ST82qKB;lSUMZp>_6L!q}kUKFmNixoZJ+EO4cGUC)bL%9VEuEg- zbQ3`b&fws0Rd(QUNjJ;J!@Y2aE9ef&KmMGwz|^bloaO8U&A6VGm6JkKc+(j)9f*Hq zeur;?sa4yfid)%_eJ&*F9#XW>FI)S8&#dFMfHNy>g(5g$_1Ic<8kQ4=*0IM4Q?IV9XtG~2au59 z1tReZybV$gpjC6?#0}&=Kxa1&RO(9m%{MdO{MegKOpF7at1tG^1KB6#jE<3$Y>`M0 z>QHC9u)~m56gPH_9TQFBW*N|GTMmC#1$RuAP=qakZYnx);HAQ0@HW$^|dLBI(?L|A3VLi`}Y{=T+n6>l5XYVlTrp-L9jT$md zH=8Bs!NJ>@_vTCB7`5|pU0Xd$I{~VqJIDw@&Wnvkd=_K$T{P3inin>XeQ}aBhVuAK za?NDL5B=2D+(p_#B-PCzYI;GkRn<{W-I5Z)1^g+%|a5&8J@t#y@2y6lN66y;|hz zfi;Iq{w?s5AE>HjQFB*6nchJ+Mw@b4Kb&uGcA{1{5L-A!3H2|NNrD%XF*bmO0jy+} I#fB690$O2$7XSbN diff --git a/app/views/__pycache__/auth.cpython-312.pyc b/app/views/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 1a890696fad73f068c957a3119b66bdeae6b5759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6701 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 diff --git a/app/views/__pycache__/auth.cpython-313.pyc b/app/views/__pycache__/auth.cpython-313.pyc deleted file mode 100755 index 7c471052ffef1685bc9d7370d34c6b96773d0ca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2430 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 Ualg7>V!DUwJxbXo8CTt<8 diff --git a/app/views/__pycache__/history.cpython-312.pyc b/app/views/__pycache__/history.cpython-312.pyc deleted file mode 100644 index 826b765656bb2e475511ad5b6802ab7e465702d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7641 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 diff --git a/app/views/__pycache__/history.cpython-313.pyc b/app/views/__pycache__/history.cpython-313.pyc deleted file mode 100755 index 25588fa5156f5394d64b1de6daf038faa3724fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7508 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 O$?{ptcNwN+?0*4oPS;Za diff --git a/app/views/__pycache__/manual.cpython-312.pyc b/app/views/__pycache__/manual.cpython-312.pyc deleted file mode 100644 index bdf43ac932da617cc06b0affbaf1d7045ca1007e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5699 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 b8onS3|4!&{6I;F@9A6N*iz+8cCSLl#X~_vB diff --git a/app/views/__pycache__/manual.cpython-313.pyc b/app/views/__pycache__/manual.cpython-313.pyc deleted file mode 100755 index 29c7f0399de0e24b597d4e7e767ba584e54e68ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5634 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 N>Fz6iN|`V}{||!UUgrP+ diff --git a/app/views/__pycache__/user.cpython-312.pyc b/app/views/__pycache__/user.cpython-312.pyc deleted file mode 100644 index 58aaf73c9e660791ed92b3af8bd013e0e2b5eda6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4160 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 2 (max_fd = 1024)... -found fd 9 mapped to socket 0 (/home/v6ole/pyproject/4an/uwsgi.sock) -running /home/v6ole/pyproject/venv/bin/uwsgi -[uWSGI] getting INI configuration from /home/v6ole/pyproject/4an/app/uwsgi.ini -*** Starting uWSGI 2.0.31 (64bit) on [Thu Dec 11 22:23:17 2025] *** -compiled with version: 13.3.0 on 26 November 2025 03:29:52 -os: Linux-6.8.0-88-generic #89-Ubuntu SMP PREEMPT_DYNAMIC Sat Oct 11 01:02:46 UTC 2025 -nodename: fnubserver -machine: x86_64 -clock source: unix -detected number of CPU cores: 22 -current working directory: /home/v6ole/pyproject/4an -detected binary path: /home/v6ole/pyproject/venv/bin/uwsgi -!!! no internal routing support, rebuild with pcre support !!! -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -chdir() to /home/v6ole/pyproject/4an/app -your processes number limit is 63617 -your memory page size is 4096 bytes - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** -detected max file descriptor number: 1024 -lock engine: pthread robust mutexes -thunder lock: disabled (you can enable it with --thunder-lock) -uWSGI http bound on 0.0.0.0:18019 fd 7 -probably another instance of uWSGI is running on the same address (0.0.0.0:18019). -bind(): Address already in use [core/socket.c line 769] -VACUUM: pidfile removed. -*** Starting uWSGI 2.0.31 (64bit) on [Thu Dec 11 22:23:18 2025] *** -compiled with version: 13.3.0 on 26 November 2025 03:29:52 -os: Linux-6.8.0-88-generic #89-Ubuntu SMP PREEMPT_DYNAMIC Sat Oct 11 01:02:46 UTC 2025 -nodename: fnubserver -machine: x86_64 -clock source: unix -detected number of CPU cores: 22 -current working directory: /home/v6ole/pyproject/4an -writing pidfile to /home/v6ole/pyproject/4an/uwsgi.pid -detected binary path: /home/v6ole/pyproject/venv/bin/uwsgi -!!! no internal routing support, rebuild with pcre support !!! -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -chdir() to /home/v6ole/pyproject/4an/app -your processes number limit is 63617 -your memory page size is 4096 bytes - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** -detected max file descriptor number: 1024 -lock engine: pthread robust mutexes -thunder lock: disabled (you can enable it with --thunder-lock) -uWSGI http bound on 0.0.0.0:18019 fd 6 -uwsgi socket 0 bound to UNIX address /home/v6ole/pyproject/4an/uwsgi.sock fd 9 -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -Python version: 3.12.3 (main, Nov 6 2025, 13:44:16) [GCC 13.3.0] -PEP 405 virtualenv detected: /home/v6ole/pyproject/venv -Set PythonHome to /home/v6ole/pyproject/venv -Python main interpreter initialized at 0x78df1aea3668 -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -python threads support enabled -your server socket listen backlog is limited to 100 connections -your mercy for graceful operations on workers is 60 seconds -mapped 703440 bytes (686 KB) for 8 cores -*** Operational MODE: preforking+threaded *** -[2025-12-11 22:23:19,123] INFO in app: 应用启动 -[2025-12-11 22:23:19,124] INFO in error_handlers: 错误处理器初始化完成 -WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x78df1aea3668 pid: 2854900 (default app) -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -*** uWSGI is running in multiple interpreter mode *** -spawned uWSGI master process (pid: 2854900) -spawned uWSGI worker 1 (pid: 2855094, cores: 2) -Python auto-reloader enabled -spawned uWSGI worker 2 (pid: 2855098, cores: 2) -spawned uWSGI worker 3 (pid: 2855101, cores: 2) -spawned uWSGI worker 4 (pid: 2855102, cores: 2) -*** Stats server enabled on 127.0.0.1:9191 fd: 22 *** -spawned uWSGI http 1 (pid: 2855106) -unable to stat() uwsgi.reload, events will be triggered as soon as the file is created -unable to stat() true, events will be triggered as soon as the file is created -[2025-12-11 22:23:29,628] INFO in auth: 重定向到 Casdoor 授权页面 -[uwsgi-python-reloader] module/file /home/v6ole/pyproject/4an/app/views/auth.py has been modified -[uwsgi-python-reloader] module/file /home/v6ole/pyproject/4an/app/views/auth.py has been modified -gateway "uWSGI http 1" has been buried (pid: 2855106) -...gracefully killing workers... -Gracefully killing worker 2 (pid: 2855098)... -Gracefully killing worker 3 (pid: 2855101)... -Gracefully killing worker 4 (pid: 2855102)... -Gracefully killing worker 1 (pid: 2855094)... -worker 1 buried after 1 seconds -worker 2 buried after 1 seconds -worker 3 buried after 1 seconds -worker 4 buried after 1 seconds -binary reloading uWSGI... -chdir() to /home/v6ole/pyproject/4an -closing all non-uwsgi socket fds > 2 (max_fd = 1024)... -found fd 9 mapped to socket 0 (/home/v6ole/pyproject/4an/uwsgi.sock) -running /home/v6ole/pyproject/venv/bin/uwsgi -[uWSGI] getting INI configuration from /home/v6ole/pyproject/4an/app/uwsgi.ini -*** Starting uWSGI 2.0.31 (64bit) on [Thu Dec 11 22:23:36 2025] *** -compiled with version: 13.3.0 on 26 November 2025 03:29:52 -os: Linux-6.8.0-88-generic #89-Ubuntu SMP PREEMPT_DYNAMIC Sat Oct 11 01:02:46 UTC 2025 -nodename: fnubserver -machine: x86_64 -clock source: unix -detected number of CPU cores: 22 -current working directory: /home/v6ole/pyproject/4an -detected binary path: /home/v6ole/pyproject/venv/bin/uwsgi -!!! no internal routing support, rebuild with pcre support !!! -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -chdir() to /home/v6ole/pyproject/4an/app -your processes number limit is 63617 -your memory page size is 4096 bytes - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** -detected max file descriptor number: 1024 -lock engine: pthread robust mutexes -thunder lock: disabled (you can enable it with --thunder-lock) -uWSGI http bound on 0.0.0.0:18019 fd 7 -probably another instance of uWSGI is running on the same address (0.0.0.0:18019). -bind(): Address already in use [core/socket.c line 769] -VACUUM: pidfile removed. -*** Starting uWSGI 2.0.31 (64bit) on [Thu Dec 11 22:23:37 2025] *** -compiled with version: 13.3.0 on 26 November 2025 03:29:52 -os: Linux-6.8.0-88-generic #89-Ubuntu SMP PREEMPT_DYNAMIC Sat Oct 11 01:02:46 UTC 2025 -nodename: fnubserver -machine: x86_64 -clock source: unix -detected number of CPU cores: 22 -current working directory: /home/v6ole/pyproject/4an -writing pidfile to /home/v6ole/pyproject/4an/uwsgi.pid -detected binary path: /home/v6ole/pyproject/venv/bin/uwsgi -!!! no internal routing support, rebuild with pcre support !!! -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -chdir() to /home/v6ole/pyproject/4an/app -your processes number limit is 63617 -your memory page size is 4096 bytes - *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** -detected max file descriptor number: 1024 -lock engine: pthread robust mutexes -thunder lock: disabled (you can enable it with --thunder-lock) -uWSGI http bound on 0.0.0.0:18019 fd 6 -uwsgi socket 0 bound to UNIX address /home/v6ole/pyproject/4an/uwsgi.sock fd 9 -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -Python version: 3.12.3 (main, Nov 6 2025, 13:44:16) [GCC 13.3.0] -PEP 405 virtualenv detected: /home/v6ole/pyproject/venv -Set PythonHome to /home/v6ole/pyproject/venv -Python main interpreter initialized at 0x7121faaa3668 -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -python threads support enabled -your server socket listen backlog is limited to 100 connections -your mercy for graceful operations on workers is 60 seconds -mapped 703440 bytes (686 KB) for 8 cores -*** Operational MODE: preforking+threaded *** -[2025-12-11 22:23:38,073] INFO in app: 应用启动 -[2025-12-11 22:23:38,074] INFO in error_handlers: 错误处理器初始化完成 -WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7121faaa3668 pid: 2857150 (default app) -uWSGI running as root, you can use --uid/--gid/--chroot options -*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** -*** uWSGI is running in multiple interpreter mode *** -spawned uWSGI master process (pid: 2857150) -spawned uWSGI worker 1 (pid: 2857296, cores: 2) -spawned uWSGI worker 2 (pid: 2857300, cores: 2) -Python auto-reloader enabled -spawned uWSGI worker 3 (pid: 2857303, cores: 2) -spawned uWSGI worker 4 (pid: 2857304, cores: 2) -*** Stats server enabled on 127.0.0.1:9191 fd: 22 *** -spawned uWSGI http 1 (pid: 2857309) -unable to stat() uwsgi.reload, events will be triggered as soon as the file is created -unable to stat() true, events will be triggered as soon as the file is created -[2025-12-11 22:23:51,348] INFO in auth: Casdoor 用户信息: {'sub': '66d04f8e-e663-4ee1-a2e9-5777901c6df7', 'iss': 'https://casdoor.dhdx.fun', 'aud': '8f323670e073612794ef', 'preferred_username': 'weijuesen', 'name': '韦矍森', 'email': 'voole@vip.qq.com', 'email_verified': True, 'picture': 'https://cdn.casbin.org/img/casbin.svg', 'phone': '19977899008', 'real_name': '韦矍森', 'roles': ['admin']} -[2025-12-11 22:23:51,367] INFO in auth: 更新用户信息: 韦矍森(19977899008) -[2025-12-11 22:23:51,368] INFO in auth: 用户 韦矍森(19977899008) 通过 Casdoor 登录成功 -[2025-12-11 22:23:51,772] INFO in dashboard: 用户 韦矍森 访问仪表盘页面 diff --git a/uwsgi.pid b/uwsgi.pid deleted file mode 100644 index 01d4044..0000000 --- a/uwsgi.pid +++ /dev/null @@ -1 +0,0 @@ -2857150