xjz: 完成comments代码注释

xjz_branch
徐锦泽 4 months ago
parent c8e0bd07ba
commit 12a9691eea

@ -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'
]
]
COMPRESS_ENABLED = False
COMPRESS_OFFLINE = False

@ -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)

@ -30,29 +30,25 @@
<script src="{% static 'blog/js/html5.js' %}" type="text/javascript"></script>
<![endif]-->
<link rel="alternate" type="application/rss+xml" title="{{ SITE_NAME }} &raquo; Feed"
href="/feed"/>
<link rel='stylesheet preload' as="font" id='twentytwelve-fonts-css'
href='{% static 'blog/fonts/fonts.css' %}'
type='text/css' media='all'/>
<link rel="alternate" type="application/rss+xml" title="{{ SITE_NAME }} &raquo; Feed" href="/feed"/>
<link rel='stylesheet preload' as="font" id='twentytwelve-fonts-css' href="{% static 'blog/fonts/fonts.css' %}" type='text/css' media='all'>
<link rel="dns-prefetch" href="//cdn.mathjax.org"/>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
<link rel="icon" href="/favicon.ico" type="image/x-icon"/>
<link rel="apple-touch-icon" href="/favicon.ico"/>
{% compress css %}
<link rel='stylesheet' id='twentytwelve-style-css' href='{% static 'blog/css/style.css' %}' type='text/css'
media='all'/>
<!-- 暂时注释掉压缩直接加载CSS -->
<!-- {% compress css %} -->
<link rel='stylesheet' id='twentytwelve-style-css' href="{% static 'blog/css/style.css' %}" type='text/css' media='all'>
<link href="{% static 'blog/css/oauth_style.css' %}" rel="stylesheet">
{% comment %}<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>{% endcomment %}
<!--[if lt IE 9]>
<link rel='stylesheet' id='twentytwelve-ie-css' href='{% static 'blog/css/ie.css' %}' type='text/css' media='all' />
<link rel='stylesheet' id='twentytwelve-ie-css' href="{% static 'blog/css/ie.css' %}" type='text/css' media='all'>
<![endif]-->
<link rel="stylesheet" href="{% static 'pygments/default.css' %}"/>
<link rel="stylesheet" href="{% static 'blog/css/nprogress.css' %}">
{% block compress_css %}
{% endblock %}
{% endcompress %}
<link rel="stylesheet" href="{% static 'blog/css/mprogress.css' %}"/>
<!-- {% endcompress %} -->
{% if GLOBAL_HEADER %}
{{ GLOBAL_HEADER|safe }}
{% endif %}
@ -62,62 +58,38 @@
<div id="page" class="hfeed site">
<header id="masthead" class="site-header" role="banner">
<hgroup>
<h1 class="site-title"><a href="/" title="{{ SITE_NAME }}" rel="home">{{ SITE_NAME }}</a>
</h1>
<h1 class="site-title"><a href="/" title="{{ SITE_NAME }}" rel="home">{{ SITE_NAME }}</a></h1>
<h2 class="site-description">{{ SITE_DESCRIPTION }}</h2>
</hgroup>
{% load i18n %}
{# <div class="i18n-selector">#}
{# <form action="{% url 'set_language' %}" method="post" id="i18n-form">{% csrf_token %}#}
{# <input name="next" type="hidden" value="{{ redirect_to }}">#}
{# <select name="language" class="i18n-select" >#}
{# {% get_current_language as LANGUAGE_CODE %}#}
{# {% get_available_languages as LANGUAGES %}#}
{# {% get_language_info_list for LANGUAGES as languages %}#}
{# {% for language in languages %}#}
{# <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected{% endif %}>#}
{# {{ language.name_local }} ({{ language.code }})#}
{# </option>#}
{# {% endfor %}#}
{# </select>#}
{# <input type="submit" value="Go">#}
{# </form>#}
{# </div>#}
{% include 'share_layout/nav.html' %}
</header><!-- #masthead -->
<div id="main" class="wrapper">
{% block content %}
{% endblock %}
{% block sidebar %}
{% endblock %}
</div><!-- #main .wrapper -->
{% include 'share_layout/footer.html' %}
</div><!-- #page -->
</body>
<footer>
<script src="//cdn.bootcss.com/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
{% compress js %}
<script type="text/javascript" src="{% static 'blog/js/jquery-3.6.0.min.js' %}"></script>
<script type="text/javascript" src="{% static 'blog/js/nprogress.js' %}"></script>
<script src="{% static 'blog/js/blog.js' %}" type="application/javascript"></script>
<script src="{% static 'blog/js/navigation.js' %}" type="application/javascript"></script>
<script src="{% static 'mathjax/js/mathjax-config.js' %}" type="application/javascript"></script>
{% block compress_js %}
{% endblock %}
{% endcompress %}
{% block footer %}
<script src="//cdn.bootcss.com/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<!-- {% compress js %} -->
<script type="text/javascript" src="{% static 'blog/js/jquery-3.6.0.min.js' %}"></script>
<script type="text/javascript" src="{% static 'blog/js/nprogress.js' %}"></script>
<script src="{% static 'blog/js/blog.js' %}" type="application/javascript"></script>
<script src="{% static 'blog/js/navigation.js' %}" type="application/javascript"></script>
<script src="{% static 'mathjax/js/mathjax-config.js' %}" type="application/javascript"></script>
{% block compress_js %}
{% endblock %}
</footer>
</html>
<!-- {% endcompress %} -->
{% block footer %}
{% endblock %}
</body>
</html>
Loading…
Cancel
Save