|
|
|
|
@ -1,62 +1,108 @@
|
|
|
|
|
# 导入 Django 内置的路径配置工具和缓存装饰器
|
|
|
|
|
from django.urls import path
|
|
|
|
|
from django.views.decorators.cache import cache_page
|
|
|
|
|
|
|
|
|
|
# 导入当前应用(blog)的视图模块,用于关联路由与视图逻辑
|
|
|
|
|
from . import views
|
|
|
|
|
|
|
|
|
|
# 定义应用命名空间(namespace),用于在模板或反向解析时区分不同应用的路由
|
|
|
|
|
# 例如:在模板中使用 {% url 'blog:index' %} 生成首页链接
|
|
|
|
|
app_name = "blog"
|
|
|
|
|
|
|
|
|
|
# 路由配置列表,每个 path 对应一个 URL 规则与视图的映射
|
|
|
|
|
urlpatterns = [
|
|
|
|
|
# 首页路由:匹配根路径(网站域名/)
|
|
|
|
|
path(
|
|
|
|
|
r'',
|
|
|
|
|
views.IndexView.as_view(),
|
|
|
|
|
name='index'),
|
|
|
|
|
r'', # URL 路径表达式,空字符串表示根路径
|
|
|
|
|
views.IndexView.as_view(), # 关联的视图类(IndexView),通过 as_view() 转换为可调用视图
|
|
|
|
|
name='index' # 路由名称,用于反向解析(如 reverse('blog:index'))
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 分页首页路由:匹配带页码的首页(如 /page/2/)
|
|
|
|
|
path(
|
|
|
|
|
r'page/<int:page>/',
|
|
|
|
|
views.IndexView.as_view(),
|
|
|
|
|
name='index_page'),
|
|
|
|
|
r'page/<int:page>/', # <int:page> 是路径参数,int 表示接收整数类型,page 是参数名
|
|
|
|
|
views.IndexView.as_view(), # 复用首页视图类,视图中会通过 page 参数处理分页
|
|
|
|
|
name='index_page'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 文章详情页路由:按日期和文章ID匹配(如 /article/2023/10/20/100.html)
|
|
|
|
|
path(
|
|
|
|
|
r'article/<int:year>/<int:month>/<int:day>/<int:article_id>.html',
|
|
|
|
|
views.ArticleDetailView.as_view(),
|
|
|
|
|
name='detailbyid'),
|
|
|
|
|
# 路径参数:year(年)、month(月)、day(日)、article_id(文章ID),均为整数
|
|
|
|
|
views.ArticleDetailView.as_view(), # 文章详情视图类,处理文章展示逻辑
|
|
|
|
|
name='detailbyid'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 分类详情页路由:按分类名匹配(如 /category/tech.html)
|
|
|
|
|
path(
|
|
|
|
|
r'category/<slug:category_name>.html',
|
|
|
|
|
views.CategoryDetailView.as_view(),
|
|
|
|
|
name='category_detail'),
|
|
|
|
|
# <slug:category_name>:slug 类型表示接收字母、数字、下划线和连字符组成的字符串(适合URL友好的名称)
|
|
|
|
|
views.CategoryDetailView.as_view(), # 分类详情视图类,展示该分类下的文章
|
|
|
|
|
name='category_detail'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 分类详情分页路由:带页码的分类页(如 /category/tech/2.html)
|
|
|
|
|
path(
|
|
|
|
|
r'category/<slug:category_name>/<int:page>.html',
|
|
|
|
|
views.CategoryDetailView.as_view(),
|
|
|
|
|
name='category_detail_page'),
|
|
|
|
|
views.CategoryDetailView.as_view(), # 复用分类视图类,通过 page 参数分页
|
|
|
|
|
name='category_detail_page'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 作者详情页路由:按作者名匹配(如 /author/alice.html)
|
|
|
|
|
path(
|
|
|
|
|
r'author/<author_name>.html',
|
|
|
|
|
views.AuthorDetailView.as_view(),
|
|
|
|
|
name='author_detail'),
|
|
|
|
|
# <author_name>:未指定类型,默认接收字符串(除特殊字符外)
|
|
|
|
|
views.AuthorDetailView.as_view(), # 作者详情视图类,展示该作者的文章
|
|
|
|
|
name='author_detail'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 作者详情分页路由:带页码的作者页(如 /author/alice/2.html)
|
|
|
|
|
path(
|
|
|
|
|
r'author/<author_name>/<int:page>.html',
|
|
|
|
|
views.AuthorDetailView.as_view(),
|
|
|
|
|
name='author_detail_page'),
|
|
|
|
|
views.AuthorDetailView.as_view(), # 复用作者视图类,通过 page 参数分页
|
|
|
|
|
name='author_detail_page'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 标签详情页路由:按标签名匹配(如 /tag/python.html)
|
|
|
|
|
path(
|
|
|
|
|
r'tag/<slug:tag_name>.html',
|
|
|
|
|
views.TagDetailView.as_view(),
|
|
|
|
|
name='tag_detail'),
|
|
|
|
|
views.TagDetailView.as_view(), # 标签详情视图类,展示该标签下的文章
|
|
|
|
|
name='tag_detail'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 标签详情分页路由:带页码的标签页(如 /tag/python/2.html)
|
|
|
|
|
path(
|
|
|
|
|
r'tag/<slug:tag_name>/<int:page>.html',
|
|
|
|
|
views.TagDetailView.as_view(),
|
|
|
|
|
name='tag_detail_page'),
|
|
|
|
|
views.TagDetailView.as_view(), # 复用标签视图类,通过 page 参数分页
|
|
|
|
|
name='tag_detail_page'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 归档页路由:匹配 /archives.html
|
|
|
|
|
path(
|
|
|
|
|
'archives.html',
|
|
|
|
|
cache_page(
|
|
|
|
|
60 * 60)(
|
|
|
|
|
views.ArchivesView.as_view()),
|
|
|
|
|
name='archives'),
|
|
|
|
|
# 缓存装饰器:cache_page(60*60) 表示缓存该页面1小时(60秒*60),减轻服务器压力
|
|
|
|
|
cache_page(60 * 60)(views.ArchivesView.as_view()),
|
|
|
|
|
name='archives' # 归档视图,通常展示按日期分组的文章列表
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 友情链接页路由:匹配 /links.html
|
|
|
|
|
path(
|
|
|
|
|
'links.html',
|
|
|
|
|
views.LinkListView.as_view(),
|
|
|
|
|
name='links'),
|
|
|
|
|
views.LinkListView.as_view(), # 友情链接视图类,展示网站链接列表
|
|
|
|
|
name='links'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 文件上传路由:匹配 /upload
|
|
|
|
|
path(
|
|
|
|
|
r'upload',
|
|
|
|
|
views.fileupload,
|
|
|
|
|
name='upload'),
|
|
|
|
|
views.fileupload, # 关联函数视图(非类视图),处理文件上传逻辑
|
|
|
|
|
name='upload'
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
# 缓存清理路由:匹配 /clean
|
|
|
|
|
path(
|
|
|
|
|
r'clean',
|
|
|
|
|
views.clean_cache_view,
|
|
|
|
|
name='clean'),
|
|
|
|
|
]
|
|
|
|
|
views.clean_cache_view, # 关联缓存清理视图,用于手动触发缓存清理
|
|
|
|
|
name='clean'
|
|
|
|
|
),
|
|
|
|
|
]
|