|
|
|
|
@ -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优化
|
|
|
|
|
]
|