|
|
|
|
@ -13,52 +13,88 @@ 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'))
|
|
|
|
|
"""
|
|
|
|
|
# 导入项目配置:用于获取静态文件/媒体文件路径、DEBUG 状态等
|
|
|
|
|
from django.conf import settings
|
|
|
|
|
# 导入国际化路由工具:生成带语言前缀的路由(如 /en/admin/、/zh-hans/blog/)
|
|
|
|
|
from django.conf.urls.i18n import i18n_patterns
|
|
|
|
|
# 导入静态文件路由工具:开发环境下提供静态文件访问(生产环境需 Nginx 处理)
|
|
|
|
|
from django.conf.urls.static import static
|
|
|
|
|
# 导入站点地图视图:关联站点地图配置,生成 sitemap.xml
|
|
|
|
|
from django.contrib.sitemaps.views import sitemap
|
|
|
|
|
# 导入 URL 路由组件:path 用于精确匹配,include 用于引入子应用路由
|
|
|
|
|
from django.urls import path, include
|
|
|
|
|
# 导入 re_path:支持正则表达式匹配 URL(适配复杂路由场景)
|
|
|
|
|
from django.urls import re_path
|
|
|
|
|
# 导入 Haystack 搜索视图工厂:用于自定义搜索视图和表单
|
|
|
|
|
from haystack.views import search_view_factory
|
|
|
|
|
|
|
|
|
|
from blog.views import EsSearchView
|
|
|
|
|
from djangoblog.admin_site import admin_site
|
|
|
|
|
from djangoblog.elasticsearch_backend import ElasticSearchModelSearchForm
|
|
|
|
|
from djangoblog.feeds import DjangoBlogFeed
|
|
|
|
|
from djangoblog.sitemap import ArticleSiteMap, CategorySiteMap, StaticViewSitemap, TagSiteMap, UserSiteMap
|
|
|
|
|
# 导入项目自定义视图和配置:关联核心功能路由
|
|
|
|
|
from blog.views import EsSearchView # 自定义 Elasticsearch 搜索视图
|
|
|
|
|
from djangoblog.admin_site import admin_site # 自定义后台管理站点(替代默认 admin)
|
|
|
|
|
from djangoblog.elasticsearch_backend import ElasticSearchModelSearchForm # 自定义搜索表单
|
|
|
|
|
from djangoblog.feeds import DjangoBlogFeed # RSS 订阅 Feed 视图
|
|
|
|
|
from djangoblog.sitemap import ( # 站点地图配置类
|
|
|
|
|
ArticleSiteMap, CategorySiteMap, StaticViewSitemap, TagSiteMap, UserSiteMap
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 站点地图聚合配置:将各类型站点地图归类,用于生成统一的 sitemap.xml
|
|
|
|
|
sitemaps = {
|
|
|
|
|
|
|
|
|
|
'blog': ArticleSiteMap,
|
|
|
|
|
'Category': CategorySiteMap,
|
|
|
|
|
'Tag': TagSiteMap,
|
|
|
|
|
'User': UserSiteMap,
|
|
|
|
|
'static': StaticViewSitemap
|
|
|
|
|
'blog': ArticleSiteMap, # 文章站点地图
|
|
|
|
|
'Category': CategorySiteMap, # 分类站点地图
|
|
|
|
|
'Tag': TagSiteMap, # 标签站点地图
|
|
|
|
|
'User': UserSiteMap, # 作者站点地图
|
|
|
|
|
'static': StaticViewSitemap # 静态页面站点地图
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
handler404 = 'blog.views.page_not_found_view'
|
|
|
|
|
handler500 = 'blog.views.server_error_view'
|
|
|
|
|
handle403 = 'blog.views.permission_denied_view'
|
|
|
|
|
# 自定义错误页面路由:指定 404/500/403 错误时跳转的视图
|
|
|
|
|
handler404 = 'blog.views.page_not_found_view' # 404 页面未找到
|
|
|
|
|
handler500 = 'blog.views.server_error_view' # 500 服务器内部错误
|
|
|
|
|
handle403 = 'blog.views.permission_denied_view'# 403 权限拒绝(注意变量名应为 handler403,此处可能是笔误)
|
|
|
|
|
|
|
|
|
|
# 基础 URL 路由:不包含语言前缀的公共路由
|
|
|
|
|
urlpatterns = [
|
|
|
|
|
# 国际化路由:提供语言切换功能(如 /i18n/setlang/ 接口)
|
|
|
|
|
path('i18n/', include('django.conf.urls.i18n')),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# 带语言前缀的路由:通过 i18n_patterns 自动添加语言前缀(如 /zh-hans/、/en/)
|
|
|
|
|
# prefix_default_language=False:默认语言不显示前缀(如中文默认不显示 /zh-hans/,直接用根路径)
|
|
|
|
|
urlpatterns += i18n_patterns(
|
|
|
|
|
# 1. 后台管理路由:使用自定义的 admin_site(替代默认 admin),访问路径如 /admin/
|
|
|
|
|
re_path(r'^admin/', admin_site.urls),
|
|
|
|
|
# 2. 博客核心路由:引入 blog 应用的子路由,命名空间为 'blog'(路由名如 blog:index)
|
|
|
|
|
re_path(r'', include('blog.urls', namespace='blog')),
|
|
|
|
|
# 3. Markdown 编辑器路由:引入 mdeditor 第三方应用的路由,用于文章编辑时的 Markdown 预览
|
|
|
|
|
re_path(r'mdeditor/', include('mdeditor.urls')),
|
|
|
|
|
# 4. 评论路由:引入 comments 应用的子路由,命名空间为 'comment'
|
|
|
|
|
re_path(r'', include('comments.urls', namespace='comment')),
|
|
|
|
|
# 5. 用户账户路由:引入 accounts 应用的子路由(登录、注册、个人中心),命名空间为 'account'
|
|
|
|
|
re_path(r'', include('accounts.urls', namespace='account')),
|
|
|
|
|
# 6. 第三方登录路由:引入 oauth 应用的子路由(GitHub、微博登录),命名空间为 'oauth'
|
|
|
|
|
re_path(r'', include('oauth.urls', namespace='oauth')),
|
|
|
|
|
# 7. 站点地图路由:生成 sitemap.xml,供搜索引擎抓取(访问路径 /sitemap.xml)
|
|
|
|
|
re_path(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
|
|
|
|
|
name='django.contrib.sitemaps.views.sitemap'),
|
|
|
|
|
# 8. RSS 订阅路由:提供两种访问路径(/feed/ 和 /rss/),均指向 DjangoBlogFeed 视图
|
|
|
|
|
re_path(r'^feed/$', DjangoBlogFeed()),
|
|
|
|
|
re_path(r'^rss/$', DjangoBlogFeed()),
|
|
|
|
|
re_path('^search', search_view_factory(view_class=EsSearchView, form_class=ElasticSearchModelSearchForm),
|
|
|
|
|
name='search'),
|
|
|
|
|
# 9. 搜索路由:使用自定义的搜索视图(EsSearchView)和表单(ElasticSearchModelSearchForm)
|
|
|
|
|
# 访问路径如 /search?q=关键词,命名为 'search'
|
|
|
|
|
re_path('^search', search_view_factory(
|
|
|
|
|
view_class=EsSearchView,
|
|
|
|
|
form_class=ElasticSearchModelSearchForm
|
|
|
|
|
), name='search'),
|
|
|
|
|
# 10. 服务器管理路由:引入 servermanager 应用的子路由(命令执行、日志查看),命名空间为 'servermanager'
|
|
|
|
|
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)
|
|
|
|
|
# 11. 位置追踪路由:引入 owntracks 应用的子路由(位置数据查看),命名空间为 'owntracks'
|
|
|
|
|
re_path(r'', include('owntracks.urls', namespace='owntracks')),
|
|
|
|
|
prefix_default_language=False # 默认语言不显示语言前缀
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 静态文件路由:开发环境下(DEBUG=True)通过 Django 提供静态文件访问(生产环境需注释,用 Nginx 处理)
|
|
|
|
|
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
|
|
|
|
|
|
|
|
|
# 媒体文件路由:仅在 DEBUG=True(开发环境)时生效,提供用户上传文件的访问(如 /media/avatar.jpg)
|
|
|
|
|
if settings.DEBUG:
|
|
|
|
|
urlpatterns += static(settings.MEDIA_URL,
|
|
|
|
|
document_root=settings.MEDIA_ROOT)
|
|
|
|
|
document_root=settings.MEDIA_ROOT)
|