diff --git a/apps/knowledge_base/migrations/0002_alter_knowledgebase_user_id.py b/apps/knowledge_base/migrations/0002_alter_knowledgebase_user_id.py new file mode 100644 index 0000000..981800b --- /dev/null +++ b/apps/knowledge_base/migrations/0002_alter_knowledgebase_user_id.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.1 on 2025-05-30 07:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('knowledge_base', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='knowledgebase', + name='user_id', + field=models.BigIntegerField(verbose_name='创建者ID'), + ), + ] diff --git a/apps/knowledge_base/models.py b/apps/knowledge_base/models.py index 79525f6..92f0127 100644 --- a/apps/knowledge_base/models.py +++ b/apps/knowledge_base/models.py @@ -16,7 +16,7 @@ class KnowledgeBase(models.Model): ] id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) - user_id = models.UUIDField(verbose_name='创建者ID') + user_id = models.BigIntegerField(verbose_name='创建者ID') name = models.CharField(max_length=100, unique=True, verbose_name='知识库名称') desc = models.TextField(verbose_name='知识库描述', null=True, blank=True) type = models.CharField( diff --git a/daren/__init__.py b/daren/__init__.py index e69de29..8ca2c7f 100644 --- a/daren/__init__.py +++ b/daren/__init__.py @@ -0,0 +1,7 @@ +# 配置Django启动时加载Celery +from __future__ import absolute_import, unicode_literals + +# 确保celery app在Django启动时被加载 +from .celery import app as celery_app + +__all__ = ('celery_app',) diff --git a/daren/celery.py b/daren/celery.py index c68644d..b11d1dc 100644 --- a/daren/celery.py +++ b/daren/celery.py @@ -1,54 +1,10 @@ import os from celery import Celery from django.conf import settings -import logging # 设置Django默认settings模块 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'daren.settings') -# 创建日志记录器 -logger = logging.getLogger(__name__) - -# 在应用启动时检查Redis连接 -def check_redis_connection(): - try: - import redis - from django.conf import settings - - # 从CELERY_BROKER_URL解析Redis连接信息 - broker_url = settings.CELERY_BROKER_URL - host = '127.0.0.1' # 默认 - port = 6379 # 默认 - db = 0 # 默认 - - # 简单解析broker_url (格式如: redis://127.0.0.1:6379/0) - if broker_url.startswith('redis://'): - parts = broker_url[8:].split('/') - if len(parts) > 1: - db = int(parts[1]) - - host_port = parts[0].split(':') - host = host_port[0] - if len(host_port) > 1: - port = int(host_port[1]) - - # 尝试连接 - r = redis.Redis(host=host, port=port, db=db, socket_timeout=10) - r.ping() - logger.info(f"成功连接到Redis服务器: {host}:{port}") - return True, None - except Exception as e: - error_msg = f"无法连接到Redis服务器: {str(e)}" - logger.error(error_msg) - return False, error_msg - -# 检查Redis连接 -redis_ok, redis_error = check_redis_connection() -if not redis_ok: - logger.critical(f"无法启动Celery,Redis连接失败: {redis_error}") - print(f"\n\n[Celery错误] Redis连接失败: {redis_error}\n") - print("请确保Redis服务正在运行,并且配置正确。如果问题仍然存在,请尝试修改settings.py中的CELERY_BROKER_URL。\n\n") - # 创建Celery应用 app = Celery('daren') diff --git a/daren/settings.py b/daren/settings.py index c45a0ec..daefaa8 100644 --- a/daren/settings.py +++ b/daren/settings.py @@ -141,9 +141,9 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/5.1/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'zh-hans' -TIME_ZONE = 'UTC' +TIME_ZONE = 'Asia/Shanghai' USE_I18N = True @@ -243,8 +243,7 @@ SIMPLE_JWT = { API_BASE_URL = 'http://81.69.223.133:48329' SILICON_CLOUD_API_KEY = 'sk-xqbujijjqqmlmlvkhvxeogqjtzslnhdtqxqgiyuhwpoqcjvf' - -GMAIL_WEBHOOK_URL = 'https://ccf7-180-159-100-165.ngrok-free.app/api/gmail/webhook/' +GMAIL_WEBHOOK_URL = 'https://7403-180-159-100-165.ngrok-free.app/api/gmail/webhook/' APPLICATION_ID = 'd5d11efa-ea9a-11ef-9933-0242ac120006' @@ -260,11 +259,12 @@ GOOGLE_CLOUD_PROJECT_ID = 'knowledge-454905' # 主题名称 GMAIL_PUBSUB_TOPIC = 'gmail-watch-topic' - +# 设置允许使用Google Pub/Sub的应用列表 +INSTALLED_APPS += ['google.cloud.pubsub'] # Celery配置 -CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0' # 使用具体IP地址而不是localhost -CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0' # 使用具体IP地址而不是localhost +CELERY_BROKER_URL = 'redis://localhost:6379/0' # 使用Redis作为消息代理 +CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 使用Redis存储任务结果 CELERY_ACCEPT_CONTENT = ['json'] # 指定接受的内容类型 CELERY_TASK_SERIALIZER = 'json' # 任务序列化和反序列化使用JSON CELERY_RESULT_SERIALIZER = 'json' # 结果序列化使用JSON @@ -276,15 +276,12 @@ CELERY_WORKER_MAX_TASKS_PER_CHILD = 500 # 工作进程处理多少个任务后 # Windows平台Celery特定设置 CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True # 启动时尝试重新连接 -CELERY_BROKER_CONNECTION_MAX_RETRIES = 10 # 最大重试次数 CELERY_WORKER_CONCURRENCY = 1 # Windows下使用单进程模式,避免权限错误 CELERY_TASK_ALWAYS_EAGER = False # 不要在Django主进程中执行任务 CELERY_BROKER_HEARTBEAT = 0 # 禁用心跳检测,解决Windows的问题 -CELERY_BROKER_CONNECTION_TIMEOUT = 30 # 设置连接超时时间 -CELERY_REDIS_SOCKET_TIMEOUT = 30 # Redis套接字超时 -CELERY_REDIS_SOCKET_CONNECT_TIMEOUT = 30 # Redis连接超时 FEISHU_APP_ID = "cli_a5c97daacb9e500d" FEISHU_APP_SECRET = "fdVeOCLXmuIHZVmSV0VbJh9wd0Kq1o5y" FEISHU_DEFAULT_APP_TOKEN = "XYE6bMQUOaZ5y5svj4vcWohGnmg" FEISHU_DEFAULT_ACCESS_TOKEN = "u-fK0HvbXVte.G2xzYs5oxV6k1nHu1glvFgG00l0Ma24VD" + diff --git a/daren/wsgi.py b/daren/wsgi.py index 385342a..8c16f9b 100644 --- a/daren/wsgi.py +++ b/daren/wsgi.py @@ -6,18 +6,27 @@ It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/5.1/howto/deployment/wsgi/ """ - import os -import pathlib - -from django.core.wsgi import get_wsgi_application +import django +# 首先设置 Django 设置模块 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'daren.settings') +django.setup() # 添加这行来初始化 Django -# 确保logs文件夹存在 -BASE_DIR = pathlib.Path(__file__).resolve().parent.parent -logs_dir = os.path.join(BASE_DIR, 'logs') -if not os.path.exists(logs_dir): - os.makedirs(logs_dir) +# 然后再导入其他模块 +from django.core.asgi import get_asgi_application +from channels.routing import ProtocolTypeRouter, URLRouter +from channels.auth import AuthMiddlewareStack +from channels.security.websocket import AllowedHostsOriginValidator +from apps.chat.routing import websocket_urlpatterns +from apps.common.middlewares import TokenAuthMiddleware -application = get_wsgi_application() +# 使用TokenAuthMiddleware代替AuthMiddlewareStack +application = ProtocolTypeRouter({ + "http": get_asgi_application(), + "websocket": AllowedHostsOriginValidator( + TokenAuthMiddleware( + URLRouter(websocket_urlpatterns) + ) + ), +}) \ No newline at end of file diff --git a/media/gmail_attachments/2_20250530153639_test2.txt b/media/gmail_attachments/2_20250530153639_test2.txt new file mode 100644 index 0000000..b16ac8e --- /dev/null +++ b/media/gmail_attachments/2_20250530153639_test2.txt @@ -0,0 +1,10 @@ +本期节目内容简介 +在参加各类比赛时,肯定会遇到竞争对手。英语单词 rival、opponent、competitor 和 contestant 的含义相似,都可以用来指“与他人之间存在竞争关系的人或团队”。在本集《你问我答》节目中,我们将通过和体育比赛有关的实例来为大家阐释这四个近义词之间的区别和用法。 + +欢迎你加入并和我们一起讨论英语学习的方方面面。请通过微博“BBC英语教学”或邮件与我们取得联系。我们的邮箱地址是 questions.chinaelt@bbc.co.uk。 + +文字稿 +(关于台词的备注: 请注意这不是广播节目的逐字稿件。本文稿可能没有体现录制、编辑过程中对节目做出的改变。) + +Feifei +大家好,欢迎收听 BBC 英语教学的《你问我答》节目,我是冯菲菲。每集节目中,我们会回答大家在英语学习时遇到的一个问题。本集的问题来自 Adela。我们来听一下她的问题。