近期文章

Python 2019-08-05

DjangoBlog部署教程

Image

本篇文章将会手把手教你如何部署DjangoBlog项目,首先介绍下我这里的基本环境,请大家仔细阅读此部分,下面的教程都会使用这些约定来介绍:

  • 系统是ubuntu 18.04 LTS
  • 假设你的域名是www.djangoblog.com
  • python虚拟环境目录在 ~/python/env
  • djangoblog源码位置在 ~/python/djangoblog
  • 登入用户server
  • 编辑器使用vim,你可以使用你喜欢的编辑器。

另外请注意,尽量不要使用root用户来部署,如果要使用root用户的话,需要使collectedstatic目录所有用户都有读权限。

准备工作

升级系统

首先需要升级系统到最新版,终端下执行:

sudo apt update
sudo apt upgrade -y

待完成更新之后,建议重新启动下系统,再进行后面的操作。终端下执行:

sudo reboot

待系统启动后,可以开始安装依赖的mysql以及python环境了。

安装依赖

终端下执行:

sudo apt install mysql-server -y #安装mysql
sudo apt install python3-dev python3-pip python-pip memcached virtualenv -y #安装pip和memcached
sudo apt ins...
猿来如此 2026-01-06

DjangoBlog 深色模式与主题切换实现方案

前言

在现代 Web 应用中,深色模式已经成为了标配功能。一个优秀的深色模式实现不仅要提供良好的视觉体验,还需要解决页面闪烁、状态持久化、系统主题跟随等技术难题。本文将深入剖析 DjangoBlog 项目的深色模式实现方案,展示如何打造一个无闪烁、高性能、用户体验优秀的主题切换系统。

整体架构

DjangoBlog 采用了前端主导、后端辅助的架构设计,主题切换完全在前端实现,后端只负责配色方案的配置。整个系统可以分为三个层次:

  1. 前端逻辑层:使用 Alpine.js + 原生 JavaScript 实现主题切换核心逻辑
  2. 样式层:基于 Tailwind CSS + CSS 变量实现响应式主题样式
  3. 后端配置层:通过 Django 模型提供 8 种配色方案选择

值得注意的是,项目实现了双主题系统: - 配色方案(Color Scheme):purple/blue/green/orange/pink/red/indigo/teal - 明暗模式(Dark Mode):dark/light

两者相互独立,用户可以选择"紫色+深色"或"蓝色+浅色"等 16 种组合。

核心实现原理

1. 防闪烁技术:关键中的关键

问题:如果页面先显示默认主题,然后 JavaScript 加载后再切换到用户偏好的主题,会产生明显的闪烁,严重影响用户体验。

解决方案:在 <head> 标签中注入一段立即执行...

猿来如此 2025-10-29

DjangoBlog插件开发指南(四):复杂插件实战案例

前言

前三篇我们学习了插件的理论知识,今天我们将通过两个真实的复杂插件案例,学习如何设计和实现生产级别的插件。

本文核心内容: - SEO 优化插件完整剖析 - 智能推荐插件设计与实现 - 性能优化技巧 - 开发最佳实践


一、案例一:SEO 优化插件

1.1 功能需求分析

核心功能: - 根据页面类型动态生成 SEO meta 标签 - 生成 Open Graph 标签(社交分享优化) - 生成 JSON-LD 结构化数据(搜索引擎优化) - 支持文章、分类、首页等多种页面类型

技术要点: - 路由感知与上下文分发 - Schema.org 结构化数据标准 - Open Graph Protocol 协议

1.2 插件架构设计

SeoOptimizerPlugin
├── 路由分发器
│   ├── 识别当前页面类型
│   └── 调用对应的SEO生成器
├── SEO数据生成器
│   ├── 文章页SEO生成
│   ├── 分类页SEO生成
│   └── 默认页SEO生成
└── 输出格式化器
    ├── meta标签
    ├── Open Graph标签
    └── JSON-LD脚本

1.3 核心实现

# plugins/seo_optimizer/plugin.py
import json
from django.utils.html imp...
1117 0
猿来如此 2025-10-29

DjangoBlog插件开发指南(三):BasePlugin 与位置渲染系统

前言

前两篇我们理解了插件的工作原理和钩子系统。今天我们将学习 BasePlugin 基类——它为所有插件提供了丰富的能力,包括位置渲染、模板系统、静态资源管理等。

本文核心内容: - BasePlugin 基类的完整能力 - 位置渲染系统详解 - 模板与静态资源管理 - 完整插件开发示例


一、BasePlugin 基类概览

1.1 基类的设计目的

BasePlugin 是所有插件的父类,它封装了插件开发中最常用的功能。通过继承这个基类,插件开发者可以专注于业务逻辑的实现,而不需要关心底层的技术细节。

这个基类主要提供了四大能力:

元数据管理:统一管理插件的基本信息,如名称、版本、作者等。这些信息会被显示在插件管理页面,帮助用户了解插件的功能。

生命周期管理:定义了插件的初始化流程和钩子注册机制,确保插件在正确的时机执行相应的操作。

位置渲染系统:这是最强大的功能,允许插件在页面的特定位置(如文章顶部、侧边栏、页脚等)渲染内容,而不需要修改模板文件。

资源管理:提供了模板渲染和静态资源(CSS、JS)管理的能力,让插件可以拥有独立的样式和交互逻辑。

1.2 基本使用模式

每个插件都需要继承 BasePlugin,并实现几个关键方法。最基本的插件结构如下:

from djangoblog.plugin_manage.base_plugin import BasePlugin
...
1020 0
猿来如此 2025-10-29

DjangoBlog插件开发指南(二):插件系统架构深度解析

前言

在第一篇中,我们通过 ViewCountPlugin 了解了插件的基本构成。今天我们将深入插件系统的底层,理解它是如何工作的。

本文核心内容: - 插件系统的整体架构设计 - 插件加载器的实现原理 - 钩子系统的设计与实现 - 实战:追踪一次完整的钩子调用


一、插件系统架构概览

1.1 四大核心模块

djangoblog/plugin_manage/
├── loader.py          # 插件加载器:扫描、加载、初始化插件
├── hooks.py           # 钩子系统:管理钩子注册与触发
├── hook_constants.py  # 钩子常量:统一管理钩子名称
└── base_plugin.py     # 插件基类:定义插件基础能力(下篇详解)

1.2 设计理念

事件驱动架构 - 核心代码在关键节点触发"事件"(钩子) - 插件监听这些事件并执行自己的逻辑 - 核心代码与插件代码完全解耦

三大设计原则 1. 关注点分离:核心功能 vs 扩展功能 2. 开闭原则:对扩展开放,对修改封闭 3. 依赖倒置:依赖抽象(钩子),不依赖具体实现


二、插件加载机制详解

2.1 插件生命周期

Django 启动
    
AppConfig.ready()
    
load_plugins() 被调用
    
遍历 settings....
997 0
猿来如此 2025-07-28

DjangoBlog插件开发指南(一):深入理解插件核心机制

在设计 DjangoBlog 之初,可扩展性是我重点考虑的特性之一。我希望能有一个优雅的机制,让开发者可以在不修改项目核心代码的情况下,自由地为其增添功能。最终,我借鉴了 WordPress 成熟的钩子(Hooks)系统,构建了 DjangoBlog 的插件体系。

这套体系的核心思想是“事件驱动”和“关注点分离”。系统在执行流程的关键节点触发“钩子(事件)”,而插件则可以“监听”这些钩子,并将自己的逻辑挂载上去。

本系列文章将带你全面了解 DjangoBlog 的插件开发。今天,我们先从分析一个内置的简单插件——文章浏览次数统计(ViewCountPlugin)——开始,来理解插件系统的基本构成和工作流程。

核心概念:Plugin 与 Hook

在深入代码之前,我们必须先理解两个基本概念:

  1. Plugin(插件):在 DjangoBlog 中,一个插件是一个继承自 BasePlugin 的 Python 类。它封装了实现特定功能所需的全部逻辑,并包含了名称、描述、版本等元数据。这些插件可以被独立地安装、激活、禁用和卸载。

  2. Hook(钩子):钩子是 DjangoBlog 在代码执行路径中预先定义好的特定切入点。当程序运行到这些点时,系统会触发一个相应的事件,并执行所有注册到该钩子上的函数。例如,当文章内容被成功获取后,系统会触发 after_article_body_ge...

16813 2