【置顶】DjangoBlog部署教程


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

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

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

准备工作

升级系统

...

Read more

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


前言

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

整体架构

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

  1. 前端逻辑层:使用 Alpine.js + 原生 JavaScript 实现主题切换核心逻辑
  2. 样式层:基于 Tailwind CSS + CSS 变量实现响应式主...

Read more

RabbitMQ学习笔记之(三) 发送方确认机制


上篇文章中,我们介绍了消费端的确认,那么在生产者有没有确认机制呢?答案是有的。 参考我们发送消息的代码段:

channel.basic_publish(exchange='testexchange', routing_key='hello', body='Hello World!{}'.format(i),
                          mandatory=True,
                          properties=pika.BasicProperties(
                              delivery_...

Read more

RabbitMQ学习笔记之(二) 消费端的确认与拒绝


首先,我们先看下这样的业务场景,在消息发出后,Consumer接收到了生产者所发出的消息,但在Consumer突然出错崩溃,或者异常退出了,但是生产者消息已经发出来了,那么这个消息可能就会丢失,为了解决这样的问题,RabbitMQ引入了ack机制。 消费者在订阅队列时,可以指定autoAck参数,当autoAck等于false时,RabbitMQ会等待消费者显式地回复确认信号后才从内存(或者磁盘)中移去消息(实质上是先打上删除标记,之后再删除)。当autoAck等于true时,RabbitMQ会⾃自动把发送出去的消息置为确认, 然后从内存(或者磁盘)中删除,而不管消费者是否真正地消费到...

Read more

RabbitMQ学习笔记之(一) 基本概念介绍


基本介绍

RabbitMQ, 是一个使用erlang编写的AMQP(高级消息队列协议)的服务实现. 简单来说, 就是一个功能强大的消息队列服务.流程上来说,是发消息者(producer)把消息放到队列(queue)中去,然后收消息者(consumer)从队列中取出消息. RabbitMQ在这个基本概念之上, 多做了一层抽象, 在发消息者队列之间, 加入了交换器 (Exchange). 这样发消息者队列就没有直接联系, 转而变成发消息者把消息给交换器, 交换器根据调度策略再把消息再给队列
rabbitmq中几个比价重要的概念如下: - Producer,生产者,创建消息,然后发...

Read more

深入理解Python中的asyncio


asyncio介绍

熟悉c#的同学可能知道,在c#中可以很方便的使用asyncawait来实现异步编程,那么在python中应该怎么做呢,其实python也支持异步编程,一般使用asyncio这个库,下面介绍下什么是asyncio:

asyncio 是用来编写 并发 代码的库,使用async/await语法。 asyncio 被用作多个提供高性能Python异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。 asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。

asyncio中的基本概念

可以看见,使用asyncio库我们也可以在pyt...

Read more