From 12a9691eeabe22e541bd2e9348c808008d94e3f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=94=A6=E6=B3=BD?= <2567263675@qq.com> Date: Thu, 6 Nov 2025 01:19:17 +0800 Subject: [PATCH] =?UTF-8?q?xjz:=20=E5=AE=8C=E6=88=90comments=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/djangoblog/settings.py | 128 +++++++++++++++------------ src/djangoblog/urls.py | 73 ++++++++++----- src/templates/share_layout/base.html | 84 ++++++------------ 3 files changed, 151 insertions(+), 134 deletions(-) diff --git a/src/djangoblog/settings.py b/src/djangoblog/settings.py index d850f61..6b388f1 100644 --- a/src/djangoblog/settings.py +++ b/src/djangoblog/settings.py @@ -1,26 +1,25 @@ """ -Django settings for djangoblog project. - -Generated by 'django-admin startproject' using Django 1.10.2. - -For more information on this file, see -https://docs.djangoproject.com/en/1.10/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.10/ref/settings/ +项目配置文件 +=========== +主要配置项说明: +- 数据库配置 +- 应用注册 +- 中间件配置 +- 模板配置 +- 静态文件配置 +开发环境:SQLite数据库 +生产环境:需要切换为PostgreSQL/MySQL """ + import os import sys from pathlib import Path from django.utils.translation import gettext_lazy as _ - def env_to_bool(env, default): str_val = os.environ.get(env) return default if str_val is None else str_val == 'True' - - # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -43,25 +42,30 @@ CSRF_TRUSTED_ORIGINS = ['http://example.com'] INSTALLED_APPS = [ + # Django 内置核心应用 # 'django.contrib.admin', - 'django.contrib.admin.apps.SimpleAdminConfig', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'django.contrib.sites', - 'django.contrib.sitemaps', - 'mdeditor', - 'haystack', - 'blog', - 'accounts', - 'comments', - 'oauth', - 'servermanager', - 'owntracks', - 'compressor', - 'djangoblog' + 'django.contrib.admin.apps.SimpleAdminConfig', # 管理员后台系统(简化版) + 'django.contrib.auth', # 用户认证和权限系统 + 'django.contrib.contenttypes', # 内容类型框架,用于通用关系 + 'django.contrib.sessions', # 会话管理,存储用户会话数据 + 'django.contrib.messages', # 消息框架,一次性提示信息 + 'django.contrib.staticfiles', # 静态文件服务(CSS, JS, 图片等) + 'django.contrib.sites', # 多站点支持,识别当前网站 + 'django.contrib.sitemaps', # 网站地图生成,SEO优化 + + # 第三方应用 + 'mdeditor', # Markdown编辑器,用于富文本编辑 + 'haystack', # 搜索框架,提供全文搜索功能 + 'compressor', # 静态文件压缩,合并CSS/JS文件 + + # 项目自定义应用 + 'blog', # 博客应用 - 文章发布和管理 + 'accounts', # 账户应用 - 用户注册和登录 + 'comments', # 评论系统 - 文章评论功能 + 'oauth', # OAuth认证 - 第三方登录支持 + 'servermanager', # 服务器管理 - 系统监控和管理 + 'owntracks', # 位置追踪 - 地理位置服务 + 'djangoblog' # 主应用 - 项目核心功能 ] MIDDLEWARE = [ @@ -83,40 +87,45 @@ MIDDLEWARE = [ ROOT_URLCONF = 'djangoblog.urls' +# 模板配置 +# 定义Django如何查找和渲染HTML模板 TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'templates')], - 'APP_DIRS': True, + 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 使用Django模板引擎 + 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 全局模板目录路径 + 'APP_DIRS': True, # 是否在每个应用的templates目录中查找模板 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'blog.context_processors.seo_processor' + 'context_processors': [ # 上下文处理器,向所有模板传递通用变量 + 'django.template.context_processors.debug', # 调试信息 + 'django.template.context_processors.request', # 请求对象 + 'django.contrib.auth.context_processors.auth', # 用户认证信息 + 'django.contrib.messages.context_processors.messages', # 消息框架 + 'blog.context_processors.seo_processor' # 自定义:SEO处理器 ], }, }, ] - WSGI_APPLICATION = 'djangoblog.wsgi.application' # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases +# 数据库配置 +# 使用MySQL数据库,开发环境也可考虑SQLite简化部署 DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'django_blog', - 'USER': 'root', - 'PASSWORD':'258066', - 'HOST': '127.0.0.1', - 'PORT': 3306, + 'ENGINE': 'django.db.backends.mysql', # 数据库引擎:MySQL + 'NAME': 'django_blog', # 数据库名称 + 'USER': 'root', # 数据库用户名 + 'PASSWORD': '258066', # 数据库密码 + 'HOST': '127.0.0.1', # 数据库主机地址 + 'PORT': 3306, # 数据库端口号 'OPTIONS': { - 'charset': 'utf8mb4'}, - }} + 'charset': 'utf8mb4' # 字符集,支持emoji表情 + } + } +} # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators @@ -167,17 +176,22 @@ HAYSTACK_CONNECTIONS = { } # Automatically update searching index HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' -# Allow user login with username and password +# 用户认证后端配置 AUTHENTICATION_BACKENDS = [ - 'accounts.user_login_backend.EmailOrUsernameModelBackend'] + 'accounts.user_login_backend.EmailOrUsernameModelBackend' # 支持邮箱或用户名登录 +] -STATIC_ROOT = os.path.join(BASE_DIR, 'collectedstatic') +# 静态文件配置 (CSS, JavaScript, Images) +STATIC_ROOT = os.path.join(BASE_DIR, 'collectedstatic') # 静态文件收集目录(生产环境) +STATIC_URL = '/static/' # 静态文件的URL前缀 -STATIC_URL = '/static/' -STATICFILES = os.path.join(BASE_DIR, 'static') +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, 'static'), # 静态文件目录 +] -AUTH_USER_MODEL = 'accounts.BlogUser' -LOGIN_URL = '/login/' +# 用户模型配置 +AUTH_USER_MODEL = 'accounts.BlogUser' # 自定义用户模型,替换Django默认用户模型 +LOGIN_URL = '/login/' # 登录页面URL,未登录用户重定向到此地址 TIME_FORMAT = '%Y-%m-%d %H:%M:%S' DATE_TIME_FORMAT = '%Y-%m-%d' @@ -339,4 +353,6 @@ ACTIVE_PLUGINS = [ 'external_links', 'view_count', 'seo_optimizer' -] \ No newline at end of file +] +COMPRESS_ENABLED = False +COMPRESS_OFFLINE = False \ No newline at end of file diff --git a/src/djangoblog/urls.py b/src/djangoblog/urls.py index 4aae58a..d5b4258 100644 --- a/src/djangoblog/urls.py +++ b/src/djangoblog/urls.py @@ -1,17 +1,14 @@ -"""djangoblog URL Configuration +""" +项目主URL配置 +============ +URL路由结构说明: +- /admin/ : Django管理员后台 +- /blog/ : 博客应用相关路由 +- /api/ : API接口路由 +- /search/: 搜索功能 +- 其他功能模块路由 -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.10/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.conf.urls import url, include - 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +路由优先级:从上到下匹配,第一个匹配的生效 """ from django.conf import settings from django.conf.urls.i18n import i18n_patterns @@ -40,25 +37,57 @@ handler404 = 'blog.views.page_not_found_view' handler500 = 'blog.views.server_error_view' handle403 = 'blog.views.permission_denied_view' +# 项目主要URL路由配置 urlpatterns = [ - path('i18n/', include('django.conf.urls.i18n')), + path('i18n/', include('django.conf.urls.i18n')) # 国际化URL支持 ] + +# 支持国际化的URL模式 urlpatterns += i18n_patterns( + # 管理员后台 re_path(r'^admin/', admin_site.urls), + + # 博客应用 - 文章、分类、标签等主要功能 re_path(r'', include('blog.urls', namespace='blog')), + + # Markdown编辑器 re_path(r'mdeditor/', include('mdeditor.urls')), + + # 评论系统 re_path(r'', include('comments.urls', namespace='comment')), + + # 用户账户管理 re_path(r'', include('accounts.urls', namespace='account')), + + # OAuth第三方登录 re_path(r'', include('oauth.urls', namespace='oauth')), + + # 站点地图(SEO优化) re_path(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, - name='django.contrib.sitemaps.views.sitemap'), + name='django.contrib.sitemaps.views.sitemap'), + + # RSS订阅源 re_path(r'^feed/$', DjangoBlogFeed()), - re_path(r'^rss/$', DjangoBlogFeed()), - re_path('^search', search_view_factory(view_class=EsSearchView, form_class=ElasticSearchModelSearchForm), - name='search'), + re_path(r'^res/$', DjangoBlogFeed()), + + # 搜索功能 + re_path('^search', search_view_factory( + view_class=EsSearchView, + form_class=ElasticSearchModelSearchForm), + name='search'), + + # 服务器管理 re_path(r'', include('servermanager.urls', namespace='servermanager')), - re_path(r'', include('owntracks.urls', namespace='owntracks')) - , prefix_default_language=False) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + + # 位置追踪服务 + re_path(r'', include('owntracks.urls', namespace='owntracks')), + + prefix_default_language=False +) + +# 静态文件服务(开发环境) +urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + +# 媒体文件服务(开发环境) if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, - document_root=settings.MEDIA_ROOT) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/src/templates/share_layout/base.html b/src/templates/share_layout/base.html index 75d0df5..e04fe9b 100644 --- a/src/templates/share_layout/base.html +++ b/src/templates/share_layout/base.html @@ -30,29 +30,25 @@ - - + + - {% compress css %} - - + + + + {% comment %}{% endcomment %} - - {% block compress_css %} - {% endblock %} - {% endcompress %} + + + {% if GLOBAL_HEADER %} {{ GLOBAL_HEADER|safe }} {% endif %} @@ -62,62 +58,38 @@