From e80d20862fc06599410902b2c792bdc8d507638a Mon Sep 17 00:00:00 2001 From: pup2vei6r <1903355860@qq.com> Date: Mon, 10 Nov 2025 00:58:16 +0800 Subject: [PATCH] ADD file via upload --- src/DjangoBlog/settings.py | 345 +++++++++++++++++++++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 src/DjangoBlog/settings.py diff --git a/src/DjangoBlog/settings.py b/src/DjangoBlog/settings.py new file mode 100644 index 0000000..06cbff7 --- /dev/null +++ b/src/DjangoBlog/settings.py @@ -0,0 +1,345 @@ +""" +#yyb Django settings for djangoblog project. + +#yyb Generated by 'django-admin startproject' using Django 1.10.2. + +#yyb For more information on this file, see +#yyb https://docs.djangoproject.com/en/1.10/topics/settings/ + +#yyb For the full list of settings and their values, see +#yyb https://docs.djangoproject.com/en/1.10/ref/settings/ +""" +import os +import sys +from pathlib import Path + +from django.utils.translation import gettext_lazy as _ + + +def env_to_bool(env, default): + """#yyb 将环境变量转换为布尔值""" + str_val = os.environ.get(env) + return default if str_val is None else str_val == 'True' + + +#yyb 构建项目内部路径:BASE_DIR / 'subdir' +BASE_DIR = Path(__file__).resolve().parent.parent + +#yyb 快速开发配置 - 不适用于生产环境 +#yyb 参见 https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ + +#yyb 安全警告:在生产环境中保持密钥保密! +SECRET_KEY = os.environ.get( + 'DJANGO_SECRET_KEY') or 'n9ceqv38)#&mwuat@(mjb_p%em$e8$qyr#fw9ot!=ba6lijx-6' +#yyb 安全警告:在生产环境中不要开启调试模式! +DEBUG = env_to_bool('DJANGO_DEBUG', True) +#yyb DEBUG = False +TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test' #yyb 检测是否在测试模式 + +#yyb 允许的主机名 +#yyb ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ['*', '127.0.0.1', 'example.com'] +#yyb Django 4.0新增配置:受信任的CSRF来源 +CSRF_TRUSTED_ORIGINS = ['http://example.com'] + +#yyb 应用定义 +INSTALLED_APPS = [ + #yyb 'django.contrib.admin', + 'django.contrib.admin.apps.SimpleAdminConfig', #yyb 使用简化的管理员配置 + 'django.contrib.auth', #yyb 认证系统 + 'django.contrib.contenttypes', #yyb 内容类型框架 + 'django.contrib.sessions', #yyb 会话框架 + 'django.contrib.messages', #yyb 消息框架 + 'django.contrib.staticfiles', #yyb 静态文件管理 + 'django.contrib.sites', #yyb 站点框架 + 'django.contrib.sitemaps', #yyb 站点地图 + 'mdeditor', #yyb Markdown编辑器 + 'haystack', #yyb 搜索框架 + 'blog', #yyb 博客应用 + 'accounts', #yyb 账户应用 + 'comments', #yyb 评论应用 + 'oauth', #yyb OAuth认证 + 'servermanager', #yyb 服务器管理 + 'owntracks', #yyb 位置跟踪 + 'compressor', #yyb 静态文件压缩 + 'djangoblog' #yyb 主应用 +] + +#yyb 中间件配置 +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', #yyb 安全中间件 + 'django.contrib.sessions.middleware.SessionMiddleware', #yyb 会话中间件 + 'django.middleware.locale.LocaleMiddleware', #yyb 国际化中间件 + 'django.middleware.gzip.GZipMiddleware', #yyb Gzip压缩 + #yyb 'django.middleware.cache.UpdateCacheMiddleware', #yyb 缓存更新(注释) + 'django.middleware.common.CommonMiddleware', #yyb 通用中间件 + #yyb 'django.middleware.cache.FetchFromCacheMiddleware', #yyb 缓存获取(注释) + 'django.middleware.csrf.CsrfViewMiddleware', #yyb CSRF保护 + 'django.contrib.auth.middleware.AuthenticationMiddleware', #yyb 认证中间件 + 'django.contrib.messages.middleware.MessageMiddleware', #yyb 消息中间件 + 'django.middleware.clickjacking.XFrameOptionsMiddleware', #yyb 点击劫持保护 + 'django.middleware.http.ConditionalGetMiddleware', #yyb 条件GET请求 + 'blog.middleware.OnlineMiddleware' #yyb 自定义在线用户中间件 +] + +#yyb 根URL配置 +ROOT_URLCONF = 'djangoblog.urls' + +#yyb 模板配置 +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', #yyb Django模板引擎 + 'DIRS': [os.path.join(BASE_DIR, 'templates')], #yyb 模板目录 + 'APP_DIRS': True, #yyb 启用应用模板目录 + 'OPTIONS': { + 'context_processors': [ #yyb 上下文处理器 + 'django.template.context_processors.debug', #yyb 调试信息 + 'django.template.context_processors.request', #yyb 请求对象 + 'django.contrib.auth.context_processors.auth', #yyb 认证信息 + 'django.contrib.messages.context_processors.messages', #yyb 消息框架 + 'blog.context_processors.seo_processor' #yyb 自定义SEO处理器 + ], + }, + }, +] + +#yyb WSGI应用配置 +WSGI_APPLICATION = 'djangoblog.wsgi.application' + +#yyb 数据库配置 +#yyb https://docs.djangoproject.com/en/1.10/ref/settings/#databases +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', #yyb MySQL数据库引擎 + 'NAME': os.environ.get('DJANGO_MYSQL_DATABASE') or 'djangoblog', #yyb 数据库名 + 'USER': os.environ.get('DJANGO_MYSQL_USER') or 'django_user', #yyb 用户名 + 'PASSWORD': os.environ.get('DJANGO_MYSQL_PASSWORD') or 'wzm216921', #yyb 密码 + 'HOST': os.environ.get('DJANGO_MYSQL_HOST') or '127.0.0.1', #yyb 主机 + 'PORT': int( + os.environ.get('DJANGO_MYSQL_PORT') or 3306), #yyb 端口 + 'OPTIONS': { + 'charset': 'utf8mb4'}, #yyb 字符集配置 + }} + +#yyb 密码验证 +#yyb https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', #yyb 用户属性相似性验证 + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', #yyb 最小长度验证 + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', #yyb 常见密码验证 + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', #yyb 数字密码验证 + }, +] + +#yyb 国际化配置 +LANGUAGES = ( + ('en', _('English')), #yyb 英语 + ('zh-hans', _('Simplified Chinese')), #yyb 简体中文 + ('zh-hant', _('Traditional Chinese')), #yyb 繁体中文 +) +LOCALE_PATHS = ( + os.path.join(BASE_DIR, 'locale'), #yyb 本地化文件路径 +) + +LANGUAGE_CODE = 'zh-hans' #yyb 默认语言 +TIME_ZONE = 'Asia/Shanghai' #yyb 时区 +USE_I18N = True #yyb 启用国际化 +USE_L10N = True #yyb 启用本地化 +USE_TZ = False #yyb 不使用时区支持 + +#yyb 静态文件 (CSS, JavaScript, Images) +#yyb https://docs.djangoproject.com/en/1.10/howto/static-files/ + +#yyb Haystack搜索配置 +HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'djangoblog.whoosh_cn_backend.WhooshEngine', #yyb Whoosh搜索引擎 + 'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'), #yyb 索引路径 + }, +} +#yyb 自动更新搜索索引 +HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' +#yyb 允许用户使用邮箱或用户名登录 +AUTHENTICATION_BACKENDS = [ + 'accounts.user_login_backend.EmailOrUsernameModelBackend'] + +STATIC_ROOT = os.path.join(BASE_DIR, 'collectedstatic') #yyb 静态文件收集目录 +STATIC_URL = '/static/' #yyb 静态文件URL +STATICFILES = os.path.join(BASE_DIR, 'static') #yyb 静态文件目录 + +AUTH_USER_MODEL = 'accounts.BlogUser' #yyb 自定义用户模型 +LOGIN_URL = '/login/' #yyb 登录URL + +TIME_FORMAT = '%Y-%m-%d %H:%M:%S' #yyb 时间格式 +DATE_TIME_FORMAT = '%Y-%m-%d' #yyb 日期格式 + +#yyb bootstrap颜色样式 +BOOTSTRAP_COLOR_TYPES = [ + 'default', 'primary', 'success', 'info', 'warning', 'danger' +] + +#yyb 分页设置 +PAGINATE_BY = 10 +#yyb HTTP缓存超时时间 +CACHE_CONTROL_MAX_AGE = 2592000 +#yyb 缓存设置 +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', #yyb 本地内存缓存 + 'TIMEOUT': 10800, #yyb 缓存超时时间(3小时) + 'LOCATION': 'unique-snowflake', #yyb 缓存位置标识 + } +} +#yyb 使用redis作为缓存 +if os.environ.get("DJANGO_REDIS_URL"): + CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.redis.RedisCache', #yyb Redis缓存后端 + 'LOCATION': f'redis://{os.environ.get("DJANGO_REDIS_URL")}', #yyb Redis连接URL + } + } + +SITE_ID = 1 #yyb 站点ID +#yyb 百度站长平台通知URL +BAIDU_NOTIFY_URL = os.environ.get('DJANGO_BAIDU_NOTIFY_URL') \ + or 'http://data.zz.baidu.com/urls?site=https://www.lylinux.net&token=1uAOGrMsUm5syDGn' + +#yyb 邮箱配置: +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #yyb SMTP后端 +EMAIL_USE_TLS = env_to_bool('DJANGO_EMAIL_TLS', False) #yyb 是否使用TLS +EMAIL_USE_SSL = env_to_bool('DJANGO_EMAIL_SSL', True) #yyb 是否使用SSL +EMAIL_HOST = os.environ.get('DJANGO_EMAIL_HOST') or 'smtp.mxhichina.com' #yyb SMTP主机 +EMAIL_PORT = int(os.environ.get('DJANGO_EMAIL_PORT') or 465) #yyb SMTP端口 +EMAIL_HOST_USER = os.environ.get('DJANGO_EMAIL_USER') #yyb 邮箱用户 +EMAIL_HOST_PASSWORD = os.environ.get('DJANGO_EMAIL_PASSWORD') #yyb 邮箱密码 +DEFAULT_FROM_EMAIL = EMAIL_HOST_USER #yyb 默认发件人 +SERVER_EMAIL = EMAIL_HOST_USER #yyb 服务器邮箱 +#yyb 设置debug=false不会处理异常邮件通知 +ADMINS = [('admin', os.environ.get('DJANGO_ADMIN_EMAIL') or 'admin@admin.com')] #yyb 管理员邮箱 +#yyb 微信管理员密码(两次MD5加密) +WXADMIN = os.environ.get( + 'DJANGO_WXADMIN_PASSWORD') or '995F03AC401D6CABABAEF756FC4D43C7' + +#yyb 日志配置 +LOG_PATH = os.path.join(BASE_DIR, 'logs') #yyb 日志路径 +if not os.path.exists(LOG_PATH): + os.makedirs(LOG_PATH, exist_ok=True) #yyb 创建日志目录 + +LOGGING = { + 'version': 1, #yyb 日志配置版本 + 'disable_existing_loggers': False, #yyb 不禁用现有日志记录器 + 'root': { + 'level': 'INFO', #yyb 根日志级别 + 'handlers': ['console', 'log_file'], #yyb 处理器 + }, + 'formatters': { #yyb 日志格式 + 'verbose': { + 'format': '[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d %(module)s] %(message)s', #yyb 详细格式 + } + }, + 'filters': { #yyb 过滤器 + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse', #yyb 要求调试模式为False + }, + 'require_debug_true': { + '()': 'django.utils.log.RequireDebugTrue', #yyb 要求调试模式为True + }, + }, + 'handlers': { #yyb 处理器 + 'log_file': { + 'level': 'INFO', #yyb 日志级别 + 'class': 'logging.handlers.TimedRotatingFileHandler', #yyb 按时间轮转的文件处理器 + 'filename': os.path.join(LOG_PATH, 'djangoblog.log'), #yyb 日志文件路径 + 'when': 'D', #yyb 按天轮转 + 'formatter': 'verbose', #yyb 使用详细格式 + 'interval': 1, #yyb 间隔1天 + 'delay': True, #yyb 延迟创建 + 'backupCount': 5, #yyb 保留5个备份 + 'encoding': 'utf-8' #yyb 文件编码 + }, + 'console': { #yyb 控制台处理器 + 'level': 'DEBUG', + 'filters': ['require_debug_true'], #yyb 仅在调试模式下生效 + 'class': 'logging.StreamHandler', + 'formatter': 'verbose' + }, + 'null': { #yyb 空处理器 + 'class': 'logging.NullHandler', + }, + 'mail_admins': { #yyb 管理员邮件处理器 + 'level': 'ERROR', + 'filters': ['require_debug_false'], #yyb 仅在非调试模式下生效 + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { #yyb 日志记录器 + 'djangoblog': { + 'handlers': ['log_file', 'console'], + 'level': 'INFO', + 'propagate': True, #yyb 向上传播 + }, + 'django.request': { #yyb Django请求日志 + 'handlers': ['mail_admins'], #yyb 发送邮件给管理员 + 'level': 'ERROR', + 'propagate': False, #yyb 不向上传播 + } + } +} + +#yyb 静态文件查找器 +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', #yyb 文件系统查找器 + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', #yyb 应用目录查找器 + #yyb other + 'compressor.finders.CompressorFinder', #yyb 压缩文件查找器 +) +COMPRESS_ENABLED = True #yyb 启用压缩 +#yyb COMPRESS_OFFLINE = True #yyb 离线压缩(注释) + +#yyb CSS压缩过滤器 +COMPRESS_CSS_FILTERS = [ + #yyb 从相对URL创建绝对URL + 'compressor.filters.css_default.CssAbsoluteFilter', + #yyb CSS压缩器 + 'compressor.filters.cssmin.CSSMinFilter' +] +#yyb JS压缩过滤器 +COMPRESS_JS_FILTERS = [ + 'compressor.filters.jsmin.JSMinFilter' #yyb JS压缩器 +] + +MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads') #yyb 媒体文件根目录 +MEDIA_URL = '/media/' #yyb 媒体文件URL +X_FRAME_OPTIONS = 'SAMEORIGIN' #yyb 帧选项:同源策略 + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' #yyb 默认自增字段类型 + +#yyb Elasticsearch配置 +if os.environ.get('DJANGO_ELASTICSEARCH_HOST'): + ELASTICSEARCH_DSL = { + 'default': { + 'hosts': os.environ.get('DJANGO_ELASTICSEARCH_HOST') #yyb Elasticsearch主机 + }, + } + HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'djangoblog.elasticsearch_backend.ElasticSearchEngine', #yyb Elasticsearch引擎 + }, + } + +#yyb 插件系统 +PLUGINS_DIR = BASE_DIR / 'plugins' #yyb 插件目录 +ACTIVE_PLUGINS = [ #yyb 激活的插件列表 + 'article_copyright', #yyb 文章版权 + 'reading_time', #yyb 阅读时间 + 'external_links', #yyb 外部链接 + 'view_count', #yyb 浏览量统计 + 'seo_optimizer' #yyb SEO优化 +] \ No newline at end of file